none
Pivot Dynamic a toda una fila. RRS feed

  • Debate general

  • Hola, la verdad estoy muy perdido con los pivot dinámicos.

    busque ejemplos y los modifique a mi situación, pero solo hace pivot a una columna y busco algo que lo haga a toda una fila me explicare mejor:

    ID   NOMBRE   APELLIDO   ORDEN   CODIGO_FACU   INSTRUMENT

    3     julio           perez           1              34622              rep_tre

    3     julio           perez           2             67577               trac_fec

    4     Mario         gomez         1            1234345             trey_ac

    4     Mario        Gomez          2             8999                 uin_op

     el pivot lo haria por medio de la columna ORDEN

    con el pivot me gustaria que terminaran asi:

    ID1   NOMBRE1  APELLIDO1   CODIGO_FACU1   NOMBRE2  APELLIDO2   CODIGO_FACU2   

     3        julio           perez              34622               julio           perez              67577         

     4       Mario         gomez              1234345          Mario          Gomez             8999           

     


    :)



    viernes, 16 de agosto de 2019 14:27

Todas las respuestas

  • Hola Augusto Mejía:

    Puedes leer de un conjunto su registro y el siguiente, y relacionarlos

    DECLARE @table TABLE
    (ID          INT, 
     NOMBRE      VARCHAR(25), 
     APELLIDO    VARCHAR(25), 
     ORDEN       INT, 
     CODIGO_FACU INT, 
     INSTRUMENT  VARCHAR(25)
    );
    INSERT INTO @table
    (ID, 
     NOMBRE, 
     APELLIDO, 
     ORDEN, 
     CODIGO_FACU, 
     INSTRUMENT
    )
    VALUES
    (3,  'julio',  'perez',  1,  34622,  'rep_tre'),
    (3,  'julio',  'perez',  2,  67577,  'trac_fec'),
    (4,  'Mario',  'gomez',  1,  1234345,  'trey_ac'),
    (4,  'Mario',  'Gomez',  2,  8999,  'uin_op');
    WITH CTE
         AS (SELECT T.ID, 
                    T.NOMBRE, 
                    T.APELLIDO, 
                    T.ORDEN, 
                    T.CODIGO_FACU, 
                    T.INSTRUMENT
             FROM @TABLE T)
         SELECT C1.ID AS ID1, 
                C1.NOMBRE AS NOMBRE1, 
                C1.APELLIDO AS APELLIDO1, 
                C1.CODIGO_FACU AS CODIGO_FACU1, 
                C2.NOMBRE AS NOMBRE2, 
                C2.APELLIDO AS APELLIDO2, 
                C2.CODIGO_FACU AS CODIGO_FACU2
         FROM CTE C1
              LEFT JOIN CTE C2 ON C1.ORDEN = (C2.ORDEN - 1)
                                  AND C1.NOMBRE = C2.NOMBRE
                                  AND C1.APELLIDO = C2.APELLIDO
         WHERE C1.ORDEN = 1;

    Salida

    También puedes usar 

    LAG/LEAD

    https://javifer2.wordpress.com/2018/09/11/lag-y-lead-siguiente-y-anterior/


    viernes, 16 de agosto de 2019 15:17
  • Genial, Muchas gracias y si tuviera en orden las variables 1,2,3,4 y 5 ¿solo agregaria otro left join?

    :)

    viernes, 16 de agosto de 2019 15:47
  • busco algo que lo haga a toda una fila me explicare mejor:
    ...
    con el pivot me gustaria que terminaran asi:
    ID1   NOMBRE1  APELLIDO1   CODIGO_FACU1   NOMBRE2  APELLIDO2   CODIGO_FACU2   
    3        julio           perez              34622               julio           perez              67577         
    4       Mario         gomez              1234345          Mario          Gomez             8999           

    Además de la sugerencia de Javier, propongo aquí otra sugerencia utilizando el pivote clásico, que es a través de GROUP BY:

    -- código #1
    SELECT ID,
           max (case when ORDEN = 1 then NOMBRE end) as [NOMBRE 1],
           max (case when ORDEN = 1 then APELLIDO end) as [APELLIDO 1],
           max (case when ORDEN = 1 then CODIGO_FACU end) as [CODIGO_FACU 1],
           max (case when ORDEN = 2 then NOMBRE end) as [NOMBRE 2],
           max (case when ORDEN = 2 then APELLIDO end) as [APELLIDO 2],
           max (case when ORDEN = 2 then CODIGO_FACU end) as [CODIGO_FACU 2]
      from tbTabla
      group by ID;

     
    En el artículo "Alas & Pivôs" encontrará explicaciones sobre el pivote, el pivote clásico y el pivote dinámico.

    Curiosidad: internamente, lo que hace el optimizador de consultas (query optimizer) es convertir el operador relacional PIVOT en una construcción pivote clásica. Analice el plan de ejecución que se dará cuenta de esto.

     

    Si esta respuesta te ayudó a resolver tu problema, recuerda marcarla.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sábado, 17 de agosto de 2019 12:15
    viernes, 16 de agosto de 2019 23:19
  • Hola:

    Genial, Muchas gracias y si tuviera en orden las variables 1,2,3,4 y 5 ¿solo agregaria otro left join?

    Si

    sábado, 17 de agosto de 2019 6:05
  • También puedes usar 
    LAG/LEAD

    Javier, probablemente la mejor solución si la versión de SQL Server es 2012 (o más reciente).

     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sábado, 17 de agosto de 2019 12:19
    sábado, 17 de agosto de 2019 12:18
  • Hola Jose:

    Sin duda. Coincido con tu opinion

    sábado, 17 de agosto de 2019 19:40