none
Pivot o Cambiar Columnas por Filas RRS feed

  • Pregunta

  • Estimados, por favor requiero vuestra ayuda

    Estoy intentando pasar de columnas a filas (y de paso aprender sobre pivot y unpivot), el problema es que no logro dar con la solución ya que no tengo datos comunes en la columna...

    Quiero pasar desde esto

    A esto...

    Traté con el unpivot con este código

    SELECT sum(nro_eval) as A, sum(nro_sin_eval) as B, sum(nro_sin_eval) as C, sum(nro_eval) as D FROM [DWHStagingArea].[dbo].[F_EvadocAvance]
    unpivot (
    Total for A IN (A,B,C,D)
    )pvt

    pero me da el siguiente error...

    Saludos y agradecido de vuestra ayuda.

    jueves, 26 de diciembre de 2019 14:52

Respuestas

  • Deleted
    • Marcado como respuesta Gabriel Núñez jueves, 26 de diciembre de 2019 15:41
    jueves, 26 de diciembre de 2019 15:04
  • Hola Gabriel Núñez:

    declare @table table
    (A DECIMAL(6,2)
    ,B decimal(6,2)
    ,C decimal(6,2)
    ,D decimal(6,2)
    ,E decimal(6,2)
    );
    
    insert into @table
    	(A,B,C,D,E)
    VALUES
    (117,1374,1491,7.85,92.15);
    
    SELECT * 
    FROM (
    SELECT A,B,C,D,E FROM @table T
    ) AS SOURCE
    UNPIVOT (COLUMNA1 FOR COLUMNA2 IN (A,B,C,D,E)) AS PVT

    Salida

    O lo que es lo mismo. Haces una select sobre * from ( y luego el origen de los datos)

    esta parte aunque no es obligatoria, te sirve como ejemplo para pivot también. Por tanto la fuente de información está en la tabla derivada.

    El unpivot lo realizas para los valores que te resuelve las filas del in. Pero observa como el resultado te lo trae del revés.

    Aquí es donde esta parte de la gracia de trabajar con una tabla derivada, y es que independientemente de lo que haya conseguido, el pivot o unpivot, tú puedes todavía aplicarle más lógica.

    declare @table table
    (A DECIMAL(6,2)
    ,B decimal(6,2)
    ,C decimal(6,2)
    ,D decimal(6,2)
    ,E decimal(6,2)
    );
    
    insert into @table
    	(A,B,C,D,E)
    VALUES
    (117,1374,1491,7.85,92.15);
    
    SELECT pvt.COLUMNA2 as columna1, pvt.COLUMNA1 as columna2 
    FROM (
    SELECT * FROM @table T
    ) AS SOURCE
    UNPIVOT (COLUMNA1 FOR COLUMNA2 IN (A,B,C,D,E)) AS PVT

    Por tanto la parte del select original, esta consiguiendo datos del conjunto PVT.

    De este modo puedes hacer igual para pivot.

    Pivot

    https://javifer2.wordpress.com/2019/11/14/pivot-cambiar-filas-por-columnas-cuando-solo-tengo-texto/

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

    Espero te ayude

    • Marcado como respuesta Gabriel Núñez jueves, 26 de diciembre de 2019 15:40
    jueves, 26 de diciembre de 2019 15:15
  • Muchas gracias José...

    Modifique la consulta para obtener los totales por columna

    SELECT Columna1, Columna2
      from (SELECT cast (sum(nro_eval) as int) as A,
                   cast (sum(nro_sin_eval) as int) as B,
                   cast (sum(tot_impl) as int) as C,
                   cast (sum(tot_alum) as int) as D
              from [DWHStagingArea].[dbo].[F_EvadocAvance]) as S
           unpivot (Columna2 for Columna1 in (A, B, C, D)) as N

    Y quedo perfecta


    jueves, 26 de diciembre de 2019 15:40

Todas las respuestas

  • Deleted
    jueves, 26 de diciembre de 2019 15:00
  • Deleted
    • Marcado como respuesta Gabriel Núñez jueves, 26 de diciembre de 2019 15:41
    jueves, 26 de diciembre de 2019 15:04
  • Hola Gabriel Núñez:

    declare @table table
    (A DECIMAL(6,2)
    ,B decimal(6,2)
    ,C decimal(6,2)
    ,D decimal(6,2)
    ,E decimal(6,2)
    );
    
    insert into @table
    	(A,B,C,D,E)
    VALUES
    (117,1374,1491,7.85,92.15);
    
    SELECT * 
    FROM (
    SELECT A,B,C,D,E FROM @table T
    ) AS SOURCE
    UNPIVOT (COLUMNA1 FOR COLUMNA2 IN (A,B,C,D,E)) AS PVT

    Salida

    O lo que es lo mismo. Haces una select sobre * from ( y luego el origen de los datos)

    esta parte aunque no es obligatoria, te sirve como ejemplo para pivot también. Por tanto la fuente de información está en la tabla derivada.

    El unpivot lo realizas para los valores que te resuelve las filas del in. Pero observa como el resultado te lo trae del revés.

    Aquí es donde esta parte de la gracia de trabajar con una tabla derivada, y es que independientemente de lo que haya conseguido, el pivot o unpivot, tú puedes todavía aplicarle más lógica.

    declare @table table
    (A DECIMAL(6,2)
    ,B decimal(6,2)
    ,C decimal(6,2)
    ,D decimal(6,2)
    ,E decimal(6,2)
    );
    
    insert into @table
    	(A,B,C,D,E)
    VALUES
    (117,1374,1491,7.85,92.15);
    
    SELECT pvt.COLUMNA2 as columna1, pvt.COLUMNA1 as columna2 
    FROM (
    SELECT * FROM @table T
    ) AS SOURCE
    UNPIVOT (COLUMNA1 FOR COLUMNA2 IN (A,B,C,D,E)) AS PVT

    Por tanto la parte del select original, esta consiguiendo datos del conjunto PVT.

    De este modo puedes hacer igual para pivot.

    Pivot

    https://javifer2.wordpress.com/2019/11/14/pivot-cambiar-filas-por-columnas-cuando-solo-tengo-texto/

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

    Espero te ayude

    • Marcado como respuesta Gabriel Núñez jueves, 26 de diciembre de 2019 15:40
    jueves, 26 de diciembre de 2019 15:15
  • Muchas gracias José...

    Modifique la consulta para obtener los totales por columna

    SELECT Columna1, Columna2
      from (SELECT cast (sum(nro_eval) as int) as A,
                   cast (sum(nro_sin_eval) as int) as B,
                   cast (sum(tot_impl) as int) as C,
                   cast (sum(tot_alum) as int) as D
              from [DWHStagingArea].[dbo].[F_EvadocAvance]) as S
           unpivot (Columna2 for Columna1 in (A, B, C, D)) as N

    Y quedo perfecta


    jueves, 26 de diciembre de 2019 15:40