Generar PIVOT dinámico en SQL Server

| lunes, 6 de julio de 2015


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:

Anónimo dijo...

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!

Jaime Andreuzzi dijo...

muy buen trabajo, si quisiera guardar el resultado en una tabla varchar(max) , como podría hacerlo

Publicar un comentario