none
Convertir Filas con misma fecha a Columna RRS feed

  • Pregunta

  • Buen dia tengo una pregunta, tengo la siguiente tabla, cuyo script es el que muestro a continuacion

    CREATE TABLE [dbo].[Asistencia](
    	[documento] [varchar](8) NULL,
    	[nombre] [varchar](150) NULL,
    	[fecha] [datetime] NULL,
    	[HORA_ENTRADA] [varchar](50) NULL,
    	[HORA_SALIDA] [varchar](50) NULL
    ) ON [PRIMARY]
    
    GO
    SET ANSI_PADDING OFF
    GO
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-10 00:00:00.000' AS DateTime), N'12:23:43', N'14:08:18')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-10 00:00:00.000' AS DateTime), N'16:20:46', N'21:54:00')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-11 00:00:00.000' AS DateTime), N'08:58:23', N'14:05:16')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-11 00:00:00.000' AS DateTime), N'16:27:06', N'19:45:17')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-12 00:00:00.000' AS DateTime), N'08:43:01', N'14:13:49')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-12 00:00:00.000' AS DateTime), N'16:28:16', N'19:59:19')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-13 00:00:00.000' AS DateTime), N'08:53:37', N'14:04:25')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-13 00:00:00.000' AS DateTime), N'16:51:17', N'19:36:38')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-14 00:00:00.000' AS DateTime), N'08:53:49', N'14:04:25')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-14 00:00:00.000' AS DateTime), N'17:23:48', N'19:55:46')
    INSERT [dbo].[Asistencia] ([documento], [nombre], [fecha], [HORA_ENTRADA], [HORA_SALIDA]) VALUES (N'167729', N'CUBA FELIPE', CAST(N'2018-09-15 00:00:00.000' AS DateTime), N'08:51:31', N'16:15:54')
    Go
    select A.documento, A.nombre, LEFT(CONVERT(VARCHAR, A.fecha, 103), 10) AS FECHA,  A.[HORA_ENTRADA] , A.[HORA_SALIDA] 
    
     from Asistencia as A
    --where A.documento='167729'
    group by A.documento, A.nombre, A.fecha, A.[HORA_ENTRADA] , A.[HORA_SALIDA]

    quiero que si hay dos registros con una misma fecha del mismo trabajador la hora_entrada y hora_salida del siguiente registro se muestre en columnas aparte.


    jueves, 27 de septiembre de 2018 0:58

Respuestas

  • Hola Abram N. Cueva:

    ;WITH cte
         AS (
         SELECT ROW_NUMBER() OVER(PARTITION BY fecha ORDER BY nombre,
                                                              fecha) AS fila,
                A.documento,
                A.nombre,
                LEFT(CONVERT(VARCHAR, A.fecha, 103), 10) AS FECHA,
                A.[HORA_ENTRADA],
                A.[HORA_SALIDA]
         FROM Asistencia AS A
         GROUP BY A.documento,
                  A.nombre,
                  A.fecha,
                  A.[HORA_ENTRADA],
                  A.[HORA_SALIDA])
         SELECT c.documento,
                c.nombre,
                c.fecha,
                c.HORA_ENTRADA,
                c.HORA_SALIDA,
                d.HORA_ENTRADA,
                d.HORA_SALIDA FROM cte c LEFT JOIN cte d ON c.nombre = d.nombre AND d.fila = c.fila + 1 AND c.fecha = d.FECHA WHERE c.fila = 1;

    Si a tu consulta, le añades una columna fila, que se reenumera por nombre (a lo mejor debe de ser por documento, pero eso solo lo sabes tú), de manera que te genera dos filas por fecha si las hay. Luego la relacionas consigo misma, por el nombre, la fecha, y la fila con su fila +1, ya puedes mostrar lo que solicitas.

    Espero te ayude.

    jueves, 27 de septiembre de 2018 6:10
  • Enumera cada fila de acuerdo al trabajador y dia y luego transpones las filas a columnas de acuerdo a la numeracion.

    WITH R AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY documento, nombre, fecha ORDER BY HORA_ENTRADA) AS rn
    FROM @Asistencia
    )
    SELECT
    	documento,
    	nombre,
    	fecha,
        MIN(CASE WHEN rn = 1 THEN HORA_ENTRADA END) AS hora_entrada_1,
        MIN(CASE WHEN rn = 1 THEN HORA_SALIDA END) AS hora_salida_1,
        MIN(CASE WHEN rn = 2 THEN HORA_ENTRADA END) AS hora_entrada_2,
        MIN(CASE WHEN rn = 2 THEN HORA_SALIDA END) AS hora_salida_2
    FROM
        R
    GROUP BY
        documento,
        nombre,
        fecha;
    GO
    
    /*
    
    documento	nombre	fecha	hora_entrada_1	hora_salida_1	hora_entrada_2	hora_salida_2
    167729	CUBA FELIPE	2018-09-10 00:00:00.000	12:23:43	14:08:18	16:20:46	21:54:00
    167729	CUBA FELIPE	2018-09-11 00:00:00.000	08:58:23	14:05:16	16:27:06	19:45:17
    167729	CUBA FELIPE	2018-09-12 00:00:00.000	08:43:01	14:13:49	16:28:16	19:59:19
    167729	CUBA FELIPE	2018-09-13 00:00:00.000	08:53:37	14:04:25	16:51:17	19:36:38
    167729	CUBA FELIPE	2018-09-14 00:00:00.000	08:53:49	14:04:25	17:23:48	19:55:46
    167729	CUBA FELIPE	2018-09-15 00:00:00.000	08:51:31	16:15:54	NULL	NULL
    
    */

    Si puedes tener un limite de entradas y salidas en un dia entonces es facil poner tantos pares como el limite, pero si no hay limite entonces tendras que recurrir a un query dinamico.  Busca en este mismo foro por "pivot dinamico".


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    jueves, 27 de septiembre de 2018 13:26

Todas las respuestas

  • Hola Abram N. Cueva:

    ;WITH cte
         AS (
         SELECT ROW_NUMBER() OVER(PARTITION BY fecha ORDER BY nombre,
                                                              fecha) AS fila,
                A.documento,
                A.nombre,
                LEFT(CONVERT(VARCHAR, A.fecha, 103), 10) AS FECHA,
                A.[HORA_ENTRADA],
                A.[HORA_SALIDA]
         FROM Asistencia AS A
         GROUP BY A.documento,
                  A.nombre,
                  A.fecha,
                  A.[HORA_ENTRADA],
                  A.[HORA_SALIDA])
         SELECT c.documento,
                c.nombre,
                c.fecha,
                c.HORA_ENTRADA,
                c.HORA_SALIDA,
                d.HORA_ENTRADA,
                d.HORA_SALIDA FROM cte c LEFT JOIN cte d ON c.nombre = d.nombre AND d.fila = c.fila + 1 AND c.fecha = d.FECHA WHERE c.fila = 1;

    Si a tu consulta, le añades una columna fila, que se reenumera por nombre (a lo mejor debe de ser por documento, pero eso solo lo sabes tú), de manera que te genera dos filas por fecha si las hay. Luego la relacionas consigo misma, por el nombre, la fecha, y la fila con su fila +1, ya puedes mostrar lo que solicitas.

    Espero te ayude.

    jueves, 27 de septiembre de 2018 6:10
  • Enumera cada fila de acuerdo al trabajador y dia y luego transpones las filas a columnas de acuerdo a la numeracion.

    WITH R AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY documento, nombre, fecha ORDER BY HORA_ENTRADA) AS rn
    FROM @Asistencia
    )
    SELECT
    	documento,
    	nombre,
    	fecha,
        MIN(CASE WHEN rn = 1 THEN HORA_ENTRADA END) AS hora_entrada_1,
        MIN(CASE WHEN rn = 1 THEN HORA_SALIDA END) AS hora_salida_1,
        MIN(CASE WHEN rn = 2 THEN HORA_ENTRADA END) AS hora_entrada_2,
        MIN(CASE WHEN rn = 2 THEN HORA_SALIDA END) AS hora_salida_2
    FROM
        R
    GROUP BY
        documento,
        nombre,
        fecha;
    GO
    
    /*
    
    documento	nombre	fecha	hora_entrada_1	hora_salida_1	hora_entrada_2	hora_salida_2
    167729	CUBA FELIPE	2018-09-10 00:00:00.000	12:23:43	14:08:18	16:20:46	21:54:00
    167729	CUBA FELIPE	2018-09-11 00:00:00.000	08:58:23	14:05:16	16:27:06	19:45:17
    167729	CUBA FELIPE	2018-09-12 00:00:00.000	08:43:01	14:13:49	16:28:16	19:59:19
    167729	CUBA FELIPE	2018-09-13 00:00:00.000	08:53:37	14:04:25	16:51:17	19:36:38
    167729	CUBA FELIPE	2018-09-14 00:00:00.000	08:53:49	14:04:25	17:23:48	19:55:46
    167729	CUBA FELIPE	2018-09-15 00:00:00.000	08:51:31	16:15:54	NULL	NULL
    
    */

    Si puedes tener un limite de entradas y salidas en un dia entonces es facil poner tantos pares como el limite, pero si no hay limite entonces tendras que recurrir a un query dinamico.  Busca en este mismo foro por "pivot dinamico".


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    jueves, 27 de septiembre de 2018 13:26