locked
Generar vista mostrando datos de forma horizontal RRS feed

  • Pregunta

  • Hola, buen dia a todos

    Me gustaria saber si es posible generar la siguiente vista, por favor su valioso apoyo.

    Tengo una tabla que almacena datos de registro de asistencia de empleados llamada registro_asistencia

    Fecha_registro	No_emp	Registro
    2023-03-01	RAUL	ASISTENCIA
    2023-03-01	HUGO	FALTA
    2023-03-01	MARIA	FALTA
    2023-03-02	RAUL	ASISTENCIA
    2023-03-02	HUGO	ASISTENCIA
    2023-03-02	MARIA	FALTA
    2023-03-03	RAUL	FALTA
    2023-03-03	HUGO	ASISTENCIA
    2023-03-03	MARIA	INCAPACIDAD
    


    Me gustaria saber si puedo generar una vista que muestre la información de forma horizontal colocando en nombre de columnas los nombres de los empleados e indicando por fecha la descripción del registro

    Fecha registro	RAUL	        HUGO	        MARIA
    2023-03-01	ASISTENCIA	FALTA	        FALTA
    2023-03-02	ASISTENCIA	ASISTENCIA	FALTA
    2023-03-03	FALTA	        ASISTENCIA	INCAPACIDAD
    

    Por favor su apoyo para saber si es posible hacerlo y de ser asi que tipo de clausula o función se podria utilizar.

    Agradezco su atención

    Saludos


    martes, 7 de marzo de 2023 17:43

Todas las respuestas

  • Hola Luarneo:

    Depende.....si los nombres son dinámicos, esto quiere decir que pueden ser los tres dados, o muchos otros diferentes, te diría que no, porque una vista no puede construirse en base a algo dinámico.

    Se puede hacer con una query o con un procedure.

    Create table registro_asistencia (Fecha_registro date,No_emp varchar(20), Registro varchar(20));
    Insert into registro_asistencia (Fecha_registro ,No_emp, Registro)
    Values
    ('2023-03-01','RAUL','ASISTENCIA'),
    ('2023-03-01','HUGO','FALTA'),
    ('2023-03-01','MARIA','FALTA'),
    ('2023-03-02','RAUL','ASISTENCIA'),
    ('2023-03-02','HUGO','ASISTENCIA'),
    ('2023-03-02','MARIA','FALTA'),
    ('2023-03-03','RAUL','FALTA'),
    ('2023-03-03','HUGO','ASISTENCIA'),
    ('2023-03-03','MARIA','INCAPACIDAD');
    GO

    Con el escenario que has dado, se resuelve así.

    DECLARE @columns nvarchar(MAX);
    DECLARE @sql nvarchar(MAX)
     
     SELECT @columns =
      STUFF(
     (
    SELECT
       ',' + QUOTENAME(LTRIM(No_emp))
     FROM
       (SELECT DISTINCT No_emp
        FROM registro_asistencia
       ) AS T
     ORDER BY
     No_emp
     FOR XML PATH('')
     ), 1, 1, '');
    
     SET @sql = N'
     SELECT
       * 
      FROM
      (  
      SELECT Fecha_registro ,No_emp, Registro
      FROM registro_asistencia
      ) AS T
      PIVOT
      (MAX(Registro) FOR No_emp IN ('+@columns + N')) AS P;';
    
    EXEC sp_executeSql @sql;

    Esto es un pivot dinámico que se va construyendo por partes.

    Pivot dinámico. ¿Cómo hacerlo y entenderlo?

    https://javifer2.wordpress.com/2019/11/14/pivot-dinamico-como-hacerlo-y-entenderlo/

    Pero si los nombres, siempre fueran los mismos, entonces si.

    Pivot Simple

    https://javifer2.wordpress.com/2019/10/16/pivot-simple-como-hacer-y-entenderlo-paso-por-paso/

    Si le echas un ojo a los artículos, verás que básicamente se parecen bastante. 

    Si desconoces la forma, entonces empieza por el estático y luego ya el dinámico.

    martes, 7 de marzo de 2023 19:30
  • Justo lo que necesito, muy claro y conciso, muchas gracias por el apoyo Javi !!!
    miércoles, 8 de marzo de 2023 22:35
  • select * FROM( SELECT "LAS COLUMNAS QUE QUIERAS" FROM "TU TABLA" )S PIVOT ( MAX("TU COLUMNA DE FECHA") FOR [TU COLUMNA DE NOMBRES] IN ([RAUL], [HUGO], [MARIA]) )P

    Me dices si te funciona

    jueves, 9 de marzo de 2023 19:05