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