none
SQL SERVER USO DE PIVOT O CUALQUIER OTRO COMANDO PARA QUE ME ORDENE LA COLUMNA EN UNA SOLA FILA RRS feed

  • Pregunta

  • HOLA AMIGOS , NECESITO UNA AYUDA URGENTE ....

    TENGO MI TABLA MARCACION

    CON ESTOS CAMPOS

    ID_MAR , DNI , FECHA , HORA , TIPO_HORA, LATITUD , LONGITUD Y OBSERVACIONES

    TIPO_HORA - > CONTIENE , ENTRADA , INICIO ALMUERZO , FIN ALMUERZO Y SALIDA-....

    A CONTINUACIÓN ESTE ES MI LISTADO CON EL SIGUIENTE COMANDO DE SELECT

    select Convert(date,Fecha) as Fecha,Convert(time,Hora) as Hora,Tipo_hora
    from Marcacion2 

    Listado BUENO AMIGOS LO QUE YO QUIERO ES ESTE LISTADO , QUE ESTA EDITADO XD

    OSEA DE LA FECHA QUE SE GENERA EN UN DIA, OSEA HOY 28/10/2018 , PARA QUE NO SE REPITA QUIERO OBVIARLO , OSEA EN UNA COLUMNA PONER SOLO LA FECHA Y A LAS OTRAS CUATRO COLUMNAS IRIAN EL TIPO_HORA QUE SERIA , ENTRADA , INICIO ALMUERZO, FIN ALMUERZO Y SALIDA .... NINPORTA QUE DIGA , HORA EN EL SUBTITULO LO QUE QUIERO ES LO DE LAS COLUMNAS EN UNA SOLA FILA...LISTADO QUE QUIERO

    LO QUE TRATE DE HACER ES UN CODIGO USANDO PIVOT PERO ESTO ME LISTA

    select Convert(date,PVT.Fecha),Convert(time,PVT.Entrada),Convert(time,PVT.[Inicio Almuerzo]),Convert(time,PVT.[Fin Almuerzo]),Convert(time,PVT.Salida) 
    from Marcacion2 
    PIVOT(MAX(Hora) FOR Tipo_hora in([Entrada],[Inicio Almuerzo],[Fin Almuerzo],[Salida])) PVT 
    where Dni='12345678' 

    LISTADO CON PIVOT

    BUENO AMIGOS QUIERO ALGO DE APOYO SE LOS AGRADEZCO DE ANTEMANO , ES DE URGENCIA MUCHAS GRACIAS POR SU ATENCION  ESTARE ATENTO A SUS RESPUESTAS....

    domingo, 28 de octubre de 2018 6:55

Respuestas

  • Create Table Marcacion2 (
        Fecha date,
    	Hora time,
    	Tipo_hora varchar(20),
    	Dni varchar(20)
    )
    go
    
    insert Marcacion2 values ('20181025', '1:38', 'Entrada', '12345678')
    insert Marcacion2 values ('20181025', '1:39', 'Inicio Almuerzo', '12345678')
    insert Marcacion2 values ('20181025', '1:44', 'Fin Almuerzo', '12345678')
    insert Marcacion2 values ('20181025', '1:55', 'Salida', '12345678')
    insert Marcacion2 values ('20181025', '1:22', 'Entrada', '12345679')
    insert Marcacion2 values ('20181025', '1:33', 'Inicio Almuerzo', '12345679')
    insert Marcacion2 values ('20181025', '1:46', 'Fin Almuerzo', '12345679')
    insert Marcacion2 values ('20181025', '1:56', 'Salida', '12345679')
    
    select DNI, PVT.Fecha, PVT.Entrada, PVT.[Inicio Almuerzo], PVT.[Fin Almuerzo], PVT.Salida
     from Marcacion2 
     PIVOT(MAX(Hora) FOR Tipo_hora in([Entrada],[Inicio Almuerzo],[Fin Almuerzo],[Salida])) PVT 
    Captura de pantalla
    • Marcado como respuesta DiegoFerChs domingo, 28 de octubre de 2018 8:33
    domingo, 28 de octubre de 2018 7:37
  • Hola DiegoFerChs:

    Puedes armar la consulta numerando las filas.

    Tal que así:

    create table marcacion (id_mar int, dni varchar(10), fecha date, hora time, tipo_hora varchar(15), latitud varchar(100))
    go
    
    insert into marcacion (id_mar, dni, fecha, hora, tipo_hora, latitud)
    values
    (1,'0000','20181028','01:39','Entrada',null),
    (2,'0000','20181028','01:45','Inicio Almuerzo',null),
    (3,'0000','20181028','03:35','Fin Almuerzo',null),
    (4,'0000','20181028','05:54','Salida',null)
    go
    
    ;with cte as (
    select row_number() over(partition by dni, fecha order by hora) as fila,
     id_mar, dni, fecha, hora, tipo_hora, latitud
     from marcacion
    )select c.fecha,c.hora, d.hora, e.hora, f.hora from cte c 
    	left join cte d on c.dni = d.dni and c.fecha = d.fecha and c.fila+1 = d.fila
    	left join cte e on c.dni = e.dni and c.fecha = e.fecha and c.fila+2 = e.fila
    	left join cte f on c.dni = f.dni and c.fecha = f.fecha and c.fila+3 = f.fila
    	where c.fila = 1
    	
    

    Cada fila numerada por dni y fecha, hace un selft join sobre el mismo conjunto.

    También se puede hacer con lag/lead siempre que tu Sql sea 2012 o superior.

    Salida:

    • Marcado como respuesta DiegoFerChs domingo, 28 de octubre de 2018 8:33
    domingo, 28 de octubre de 2018 7:53

Todas las respuestas

  • Create Table Marcacion2 (
        Fecha date,
    	Hora time,
    	Tipo_hora varchar(20),
    	Dni varchar(20)
    )
    go
    
    insert Marcacion2 values ('20181025', '1:38', 'Entrada', '12345678')
    insert Marcacion2 values ('20181025', '1:39', 'Inicio Almuerzo', '12345678')
    insert Marcacion2 values ('20181025', '1:44', 'Fin Almuerzo', '12345678')
    insert Marcacion2 values ('20181025', '1:55', 'Salida', '12345678')
    insert Marcacion2 values ('20181025', '1:22', 'Entrada', '12345679')
    insert Marcacion2 values ('20181025', '1:33', 'Inicio Almuerzo', '12345679')
    insert Marcacion2 values ('20181025', '1:46', 'Fin Almuerzo', '12345679')
    insert Marcacion2 values ('20181025', '1:56', 'Salida', '12345679')
    
    select DNI, PVT.Fecha, PVT.Entrada, PVT.[Inicio Almuerzo], PVT.[Fin Almuerzo], PVT.Salida
     from Marcacion2 
     PIVOT(MAX(Hora) FOR Tipo_hora in([Entrada],[Inicio Almuerzo],[Fin Almuerzo],[Salida])) PVT 
    Captura de pantalla
    • Marcado como respuesta DiegoFerChs domingo, 28 de octubre de 2018 8:33
    domingo, 28 de octubre de 2018 7:37
  • Hola DiegoFerChs:

    Puedes armar la consulta numerando las filas.

    Tal que así:

    create table marcacion (id_mar int, dni varchar(10), fecha date, hora time, tipo_hora varchar(15), latitud varchar(100))
    go
    
    insert into marcacion (id_mar, dni, fecha, hora, tipo_hora, latitud)
    values
    (1,'0000','20181028','01:39','Entrada',null),
    (2,'0000','20181028','01:45','Inicio Almuerzo',null),
    (3,'0000','20181028','03:35','Fin Almuerzo',null),
    (4,'0000','20181028','05:54','Salida',null)
    go
    
    ;with cte as (
    select row_number() over(partition by dni, fecha order by hora) as fila,
     id_mar, dni, fecha, hora, tipo_hora, latitud
     from marcacion
    )select c.fecha,c.hora, d.hora, e.hora, f.hora from cte c 
    	left join cte d on c.dni = d.dni and c.fecha = d.fecha and c.fila+1 = d.fila
    	left join cte e on c.dni = e.dni and c.fecha = e.fecha and c.fila+2 = e.fila
    	left join cte f on c.dni = f.dni and c.fecha = f.fecha and c.fila+3 = f.fila
    	where c.fila = 1
    	
    

    Cada fila numerada por dni y fecha, hace un selft join sobre el mismo conjunto.

    También se puede hacer con lag/lead siempre que tu Sql sea 2012 o superior.

    Salida:

    • Marcado como respuesta DiegoFerChs domingo, 28 de octubre de 2018 8:33
    domingo, 28 de octubre de 2018 7:53