Explicación de la Función Pivot en SQL Server


Aunque ya habíamos realizado un post donde hablamos de la función Pivot como herramienta para crear tablas de referencias cruzadas, esta vez hemos creado e incluido un video con la explicación del tema.
Ejemplo1Las operaciones con Pivot nos permitirá convertir los resultados de una consulta que se presentan en filas y mostrarlos en columnas. Pivot utiliza las funciones de agregado para presentar los datos en columnas.

Para ejemplificar la función vamos a usar la base de datos Northwind y si no la tienes puedes descargarla haciendo click aquí

—-PIVOT
Create view ventascategoria
as
Select c.categoryname, DATEPART(yyyy,o.orderdate) as año
, d.unitprice * d.quantity as total from categories as c
inner join products as p on c.CategoryID=p.CategoryID
inner join [Order Details] as d on p.ProductID=d.ProductID
inner join orders as o on o.orderid=d.orderid
Go
—-Forma 1
Select categoryname, [1996], [1997],[1998] from
(select categoryname, año, total from ventascategoria) as p
pivot( sum(total)
for año in ([1996], [1997],[1998])) as pvt
Go
—-Forma 2
select * from ventascategoria
pivot( sum(total)
for año in ([1996], [1997],[1998])) as pvt
Go

De la misma manera que existe la función Pivot para crear una tabla cruzada, una tabla cruzada la podemos convertir en una tabla regular con la funciónn UNPIVOT, veamos el siguiente ejemplo

—-Creando una tabla a partir de los datos de la consulta con función Pivot

SELECT Customerid, [1] AS Emp1, [2] AS Emp2, [3] AS Emp3, [4] AS Emp4, [5] AS Emp5
into TablaPivot
FROM
(SELECT OrderID, EmployeeID, Customerid
FROM orders)p
PIVOT
(
COUNT (Orderid)
FOR EmployeeID IN
( [1], [2], [3], [4], [5] )
) AS pvt
ORDER BY pvt.Customerid;

—-Usando la función Unpivot para hacer la operación inversa

SELECT CustomerID, Employee, Orders
FROM
(SELECT CustomerId, Emp1, Emp2, Emp3, Emp4, Emp5
FROM TablaPivot) p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

Leave a Reply

Your email address will not be published. Required fields are marked *