Principales respuestas
Sigo con problemas al pasar columnas a filas.

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, 4000Y 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, 4000Pero en su lugar, me sale de la siguiente manera:
FECHA VENDEDORID VENDEDORNOMBRE GRUPO VALOR CANTIDAD
El código que tengo es el siguiente:
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 4000SELECT 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.- Editado Carlos Cuenta miércoles, 16 de mayo de 2018 20:23
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
-
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
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
-
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.
-
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
-
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.
-
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.