none
Transformación de Filas a Columnas RRS feed

  • Pregunta

  • Buenos días;

    Para solicitar su ayuda con lo siguiente, tengo una tabla con la siguiente estructura:

    Documento Articulo 
    Ticket1       ProductoA 
    Ticket1       ProductoB 
    Ticket1       ProductoC 
    Ticket1       ProductoD 
    Ticket4       ProductoC 
    Ticket4       ProductoD 
    Ticket5       ProductoA 
    Ticket5       ProductoB 
    Ticket5       ProductoC 
    Ticket5       ProductoD

    Quiero transformar la salida o la consulta para que me de un resultado como este:

    Documento Col1          Col2          Col3          Col4
    Ticket1       ProductoA  ProductoB  ProductoC  ProductoD
    Ticket4       ProductoC  ProductoD  Null           Null
    Ticket5       ProductoA  ProductoB  ProductoC  ProductoD

    Agradezco de antemano.

     

    domingo, 20 de mayo de 2018 14:08

Todas las respuestas

  • Hola, basado en estos hilos y el pivot del guille logré armar esta query

    Pivot y Unpivot en SQL Server 2005

    move cells left in sql if left contains null and right contains value

    Create Table #Prueba 
    (
     id   int,
     Documento Varchar(10),
     Articulo  Varchar(20)
     )
     
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket1','ProductoA')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket1','ProductoB')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket1','ProductoC')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket1','ProductoD')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket4','ProductoC')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket4','ProductoD')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket5','ProductoA')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket5','ProductoB')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket5','ProductoC')
     insert into #Prueba ( Documento ,Articulo ) values ('Ticket5','ProductoD')
     
     select * from #Prueba
     
     select  
    
     ROW_NUMBER() OVER (Order by Id) AS id,
     Documento,
    
     max(CASE WHEN Articulo = 'ProductoA' THEN 'ProductoA' END) AS col1,
    
     max(CASE WHEN Articulo = 'ProductoB' THEN 'ProductoB' END) AS col2,
    
     max(CASE WHEN Articulo = 'ProductoC' THEN 'ProductoC' END) AS col3,
    
     max(CASE WHEN Articulo = 'ProductoD' THEN 'ProductoD' END) AS col4
     
     from #Prueba
     group by Documento,Id
     
     
     SELECT
     Documento,
        col1 = MIN(CASE WHEN y.rn = 1 THEN y.val END),
        col2 = MIN(CASE WHEN y.rn = 2 THEN y.val END),
        col3 = MIN(CASE WHEN y.rn = 3 THEN y.val END),
        col4 = MIN(CASE WHEN y.rn = 4 THEN y.val END)
       
    FROM 
    (
     select  
    
     ROW_NUMBER() OVER (Order by Id) AS id,
     Documento,
     max(CASE WHEN Articulo = 'ProductoA' THEN 'ProductoA' END) AS col1,
     max(CASE WHEN Articulo = 'ProductoB' THEN 'ProductoB' END) AS col2,
     max(CASE WHEN Articulo = 'ProductoC' THEN 'ProductoC' END) AS col3,
     max(CASE WHEN Articulo = 'ProductoD' THEN 'ProductoD' END) AS col4
     from #Prueba
     group by Documento,Id
     )
    
    t
      OUTER APPLY
        ( SELECT
              x.val,
              rn = ROW_NUMBER() OVER (ORDER BY rn)
          FROM
          ( VALUES 
            (col1,1), (col2,2), (col3,3), (col4,4)
          ) x (val, rn) 
          WHERE x.val IS NOT NULL
        ) y 
    GROUP BY 
        t.id,Documento ;  
     
     drop table #Prueba



    Votar es agradecer.
    Saludos.
    Lima-Perú




    domingo, 20 de mayo de 2018 23:29
  • ¿Se solucionó tu consulta?

    ¿Necesitas algo mas?


    Votar es agradecer.
    Saludos.
    Lima-Perú

    jueves, 24 de mayo de 2018 20:21