Generar PIVOT dinámico en SQL Server, How to implement dynamic Pivoting in SQL Server
Que tal amigos de la comunidad,
Por pedido de amigos y preguntas frecuentes, deseo compartirles como armar un Pivot dinámico.
Esta característica de SQL Server, disponible desde la versión 2005, que nos permite convertir filas en columnas, en base a una columna específica, podemos hacerla dinámica o estática.
Veamos, si tenemos el siguiente resultado de un query que muestra las ventas de empleados por día.
Y deseamos convertir las filas Fecha en columnas y que me muestre la cantidad vendida por cada empleado, algo así:
Entonces, para lograrlo hacemos uso de la sentencia PIVOT SQL Server, les comparto este query y úsenlo según sus escenarios.
DECLARE @columns varchar(MAX); DECLARE @sql nvarchar(max) CREATE TABLE #Table ( IdEmpleado int, Turno char(1), CantidadVenta numeric(18,7), Fecha date ); INSERT INTO #Table SELECT '1', 'A', '10','2015-07-05' UNION ALL SELECT '1', 'A', '15','2015-07-12' UNION ALL SELECT '1', 'A', '25','2015-07-18' UNION ALL SELECT '1', 'A', '6','2015-07-25' UNION ALL SELECT '1', 'A', '9','2015-07-27' UNION ALL SELECT '1', 'A', '15','2015-07-26' UNION ALL SELECT '2', 'B', '26','2015-07-26' UNION ALL SELECT '2', 'B', '19','2015-07-26' UNION ALL SELECT '2', 'B', '89','2015-07-26' UNION ALL SELECT '3', 'A', '56','2015-07-26' UNION ALL SELECT '3', 'A', '15','2015-07-26' --SELECT * from #Table SET @columns = STUFF( ( SELECT ',' + QUOTENAME(LTRIM(Fecha)) FROM (SELECT DISTINCT Fecha FROM #Table ) AS T ORDER BY Fecha FOR XML PATH('') ), 1, 1, ''); SET @sql = N' SELECT * FROM ( SELECT IdEmpleado, Turno, CantidadVenta, Fecha FROM #Table ) AS T PIVOT ( SUM(CantidadVenta) FOR Fecha IN (' + @columns + N') ) AS P order by IdEmpleado;'; EXEC sp_executesql @sql; DROP TABLE #Table;
Saludos, si tienen una pregunta no duden en publicarla.
2 comentarios:
No me ordena como yo quiero, es decir con una columna adicional que indica el order que yo quiero. Ejemplo:
Codigo Descripcion
3 FFFF
1 AAAA
5 CCCC
quiero que retorne [AAAA],[FFFF],[CCCC] pero lo devuelve ordenado alfabéticamente. No puedo colocar un ORDER BY interno, gracias!
muy buen trabajo, si quisiera guardar el resultado en una tabla varchar(max) , como podría hacerlo
Publicar un comentario