none
Sigo con problemas al pasar columnas a filas. RRS feed

  • Pregunta

  • Hola amigos del foro: Sigo con problemas al pasar columnas a filas, con el ejemplo de Javi Fernández F en mi pregunta anterior,https://social.msdn.microsoft.com/Forums/es-ES/c48cc2d2-66e0-444b-bf6a-52800eb0b868/ayuda-en-conversin-de-columnas-a-filas?forum=sqlserveres , me indicó un ejemplo de cómo hacer un doble Unpivot, pero no salen los registros de la forma en que los necesito.

    Para repasar: Tengo una tabla con los registros de venta de la siguiente forma:

    Fecha, VendedorID, VendedorNombre, Cantidad1, Valor1, Cantidad2, Valor2, Cantidad3, Valor3
    15/05/2018,  01,   Vendedor1,                  15,      2500,     20,          3000,       30,        4000

    Y los quiero de esta forma:

    Fecha, VendedorID, VendedorNombre, Grupo ,    Cantidad,  Valor
     15/05/2018,  01, Vendedor1,         Cantidad1, 15, 2500
    15/05/2018,  01, Vendedor1,         Cantidad2, 20, 3000
    15/05/2018,  01, Vendedor1,         Cantidad3, 30, 4000

    Pero en su lugar, me sale de la siguiente manera:

    FECHA    VENDEDORID    VENDEDORNOMBRE      GRUPO    VALOR    CANTIDAD
      2018-05-15    1    Vendedor01        Cantidad1    15    2500
      2018-05-15    1    Vendedor01        Cantidad1    15    3000
      2018-05-15    1    Vendedor01        Cantidad1    15    4000
      2018-05-15    1    Vendedor01        Cantidad2    20    2500
      2018-05-15    1    Vendedor01        Cantidad2    20    3000
      2018-05-15    1    Vendedor01        Cantidad2    20    4000
      2018-05-15    1    Vendedor01        Cantidad3    30    2500
      2018-05-15    1    Vendedor01        Cantidad3    30    3000
      2018-05-15    1    Vendedor01        Cantidad3    30    4000

    El código que tengo es el siguiente:

    SELECT  Fecha, VendedorID,
     ROW_NUMBER() OVER(PARTITION BY VendedorID ORDER BY Fecha) AS FILA,
     Denom1, Cantidad, Valor
     FROM ( 
      SELECT SucursalID, Fecha, VendedorID,
             Cantidad1, Valor1,
             Cantidad2, Valor2,
             Cantidad3, Valor3
      FROM dbo.qryVentasDetalle
      ) Principal
      
      UNPIVOT
      (
          Cantidad FOR Denom1 IN (Cantidad1, Cantidad2, Cantidad3)
      ) Cantidad
           
      UNPIVOT
      (
          Valor FOR Denom2 IN (Valor1, Valor2, Valor3)
      ) Valor
      WHERE RIGHT(Denom1,1) =  RIGHT(Denom2,1)



    Gracias a todos por su ayuda.
    miércoles, 16 de mayo de 2018 20:18

Respuestas

  • Hola Carlos:

    He repasado tu propia consulta, con tus minimas variaciones de sintaxis y a mi me resultan 3 filas, no 9.

    Pero me he dado cuenta de que tu no estas trabajando sobre el origen que pusiste en el ticket, sino sobre tu tabla dbo.querydetalle, ¿es posible, que tu tabla tenga varias anotaciones para el día, del vendedor?

    Un saludo

    • Marcado como respuesta Carlos Cuenta jueves, 24 de mayo de 2018 20:21
    jueves, 17 de mayo de 2018 5:24
  • Es mas facil hacerlo con CROSS APPLY ya que solo puedes unpivot un conjunto de columnas a la vez.

    DECLARE @despivot table
    (Fecha          DATE,
     VendedorId     INT,
     VendedorNombre VARCHAR(100),
     Cantidad1      INT,
     Valor1         FLOAT,
     Cantidad2      INT,
     Valor2         FLOAT,
     Cantidad3      INT,
     Valor3         FLOAT
    );
    
    INSERT INTO @despivot
    (Fecha,
     VendedorId,
     VendedorNombre,
     Valor1,
     Cantidad1,
     Valor2,
     Cantidad2,
     Valor3,
     Cantidad3
    )
    VALUES
    ('20180515',
     1,
     'Vendedor01',
     15,
     2500,
     20,
     3000,
     30,
     4000
    ),
    ('20180515',
     2,
     'Vendedor02',
     16,
     2600,
     26,
     3006,
     36,
     4006
    )
    ;
    
    SELECT
    	A.Fecha,
        A.VendedorId,
        A.VendedorNombre,
    	B.grupo,
        B.cantidad,
        B.valor
    FROM
    	@despivot AS A
    	CROSS APPLY
    	(
    	VALUES
    		(1, A.Cantidad1, A.Valor1),
    		(2, A.Cantidad2, A.Valor2),
    		(3, A.Cantidad3, A.Valor3)
    	) AS B(grupo, cantidad, valor)
    ORDER BY
    	A.VendedorId,
    	A.Fecha,
    	B.grupo;
    GO


    AMB

    Some guidelines for posting questions...

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

    • Marcado como respuesta Carlos Cuenta jueves, 24 de mayo de 2018 20:21
    viernes, 18 de mayo de 2018 17:40

Todas las respuestas

  • Hola Carlos:

    He repasado tu propia consulta, con tus minimas variaciones de sintaxis y a mi me resultan 3 filas, no 9.

    Pero me he dado cuenta de que tu no estas trabajando sobre el origen que pusiste en el ticket, sino sobre tu tabla dbo.querydetalle, ¿es posible, que tu tabla tenga varias anotaciones para el día, del vendedor?

    Un saludo

    • Marcado como respuesta Carlos Cuenta jueves, 24 de mayo de 2018 20:21
    jueves, 17 de mayo de 2018 5:24
  • Hola estimado Javi Fernández F , no hay repeticiones con el vendedor, pude hacer la consulta usando Cross Apply, pero quiero poder hacerlo con el Unpivot. Ya que a ti te resulta sin problemas voy a hacer unas pruebas mas este fin de semana. Saludos y gracias por la ayuda.

                                                                                              
    viernes, 18 de mayo de 2018 16:58
  • Es mas facil hacerlo con CROSS APPLY ya que solo puedes unpivot un conjunto de columnas a la vez.

    DECLARE @despivot table
    (Fecha          DATE,
     VendedorId     INT,
     VendedorNombre VARCHAR(100),
     Cantidad1      INT,
     Valor1         FLOAT,
     Cantidad2      INT,
     Valor2         FLOAT,
     Cantidad3      INT,
     Valor3         FLOAT
    );
    
    INSERT INTO @despivot
    (Fecha,
     VendedorId,
     VendedorNombre,
     Valor1,
     Cantidad1,
     Valor2,
     Cantidad2,
     Valor3,
     Cantidad3
    )
    VALUES
    ('20180515',
     1,
     'Vendedor01',
     15,
     2500,
     20,
     3000,
     30,
     4000
    ),
    ('20180515',
     2,
     'Vendedor02',
     16,
     2600,
     26,
     3006,
     36,
     4006
    )
    ;
    
    SELECT
    	A.Fecha,
        A.VendedorId,
        A.VendedorNombre,
    	B.grupo,
        B.cantidad,
        B.valor
    FROM
    	@despivot AS A
    	CROSS APPLY
    	(
    	VALUES
    		(1, A.Cantidad1, A.Valor1),
    		(2, A.Cantidad2, A.Valor2),
    		(3, A.Cantidad3, A.Valor3)
    	) AS B(grupo, cantidad, valor)
    ORDER BY
    	A.VendedorId,
    	A.Fecha,
    	B.grupo;
    GO


    AMB

    Some guidelines for posting questions...

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

    • Marcado como respuesta Carlos Cuenta jueves, 24 de mayo de 2018 20:21
    viernes, 18 de mayo de 2018 17:40
  • Muchas gracias Hunchback , tu ayuda es de mucha utilidad, al final yo terminé usando Cross Apply porque me parece que tiene un mejor desempeño, pero yo quería usar Unpivot y poder compararlo con Cross Aplly. Este último me pareció mejor.

    Muy agradecido por tu valioso tiempo. Saludos.

                                  
    jueves, 24 de mayo de 2018 20:13
  • Saludos Javi Fernández F , por fin encontré cual fue mi error. Cómo la cantidad de columnas eran muchas para ponerlas en el ejemplo que puse más arriba, no puse que los nombres de las columnas no correspondían en forma correcta para poder utilizar Unpivot. Por ejemplo, tengo los nombres de columnas que quiero pasar a filas: Vendedor01, Cantidad01, Seccion1, Total1, eso me provocaba un error al momento de evaluar Where Right(Valor,1)=Right(Cantidad,1).

    Gracias por tu tiempo y ayuda.

     
    jueves, 24 de mayo de 2018 20:21