El power de PIVOT !!! - (SQL Server 2005)
Post cruzado de: blog en 3devnet.com
Se ha escuchando hablar bastante de la nueva sentencia PIVOT que viene con SQL Server 2005, ps bien, esta vez sólo quiero ejemplificar acerca del tema. PIVOT es un sentencia que se usa para cruzar filas en columnas para mostrar resultados, la cual por cierto, toma un vison más estructurada, clara y agradable,... esta sentencia debe usarse para obtener resultados resumen más claros y descriptivos. Más información de esta sentencia pueden leerlo: http://msdn2.microsoft.com/es-es/library/ms177410.aspx.
Ahora si, vamos con el ejemplo ilustrativo. Usaremos algunas tablas de la base de datos Northwind, como Orders, Orders Details, Employees, Products. El objetivo es listar el valor total vendido por cada empleado para los siguientes productos: 'Alice Mutton','Filo Mix','Flotemysost','Geitost', 'Konbu','Maxilaku','Pavlova','Tofu','Vegie-spread'. Muy bien, en SQL Server 2000 puede lograrse con este transact que programé como posible solución:
NOTA vea el ejemplo que se ilustra en http://www.maestrosdelweb.com/editorial/sqlserver2000/ para analizar todo el código necesario para lograr un cruce de filas y columnas en SQL Server 2000, verás que no es nada divertido gastarse el tiempo en eso....;
SELECT Ventas1.*
FROM (SELECT Empleado,
(SELECT Products.ProductName FROM Products
WHERE Products.Productid=Ventas.ProductID) Producto,
SUM (ventas.ValorVendido)Total
FROM (SELECT (C.lastname + ' ' + c.firstname)Empleado,ProductId,
(OD.Unitprice*OD.Quantity) [ValorVendido]
FROM [Order Details] OD
INNER JOIN ( [Orders] O
INNER JOIN Employees C
ON O.Employeeid=C.Employeeid)
ON OD.Orderid=O.OrderID) Ventas
GROUP BY Empleado, Productid) Ventas1
WHERE Producto IN('Alice Mutton','Filo Mix','Flotemysost','Geitost','Konbu','Maxilaku','Pavlova','Tofu','Vegie-spread')
Si te percataste en el código anterior, para lograr el objetivo hemos usado sentencias INNER JOINs y SUBQUERYs (3 subquerys), tomando el transact una forma no tan fácil de programar y que además no es el más óptimo. Como veremos a continuación, los resultados no son nada descriptivos y mucho peor organizados, como para presentárselos a tu jefe por ejemplo, ya me imagino que palabras te lanza cuando le presentes esa lista..
Podemos dar una mejor solución a este problema usando la sentencia PIVOT de SQL Server 2005, es decir, pivoteando el resultado anterior de la siguiente manera:
SELECT Empleado, [Alice Mutton],[Filo Mix],[Flotemysost],
[Geitost],[Konbu], [Maxilaku],[Pavlova],[Tofu],[Vegie-spread]
FROM (SELECT Empleado,
(SELECT PRoducts.Productname FROM Products
WHERE Products.Productid=Ventas.Productid) Producto,
SUM (ventas.ValorVendido) Total
FROM (SELECT (C.lastname+ ' ' + C.firstname) Empleado, ProductID,
(OD.Unitprice*OD.Quantity) [ValorVendido]
FROM [Order Details]OD
INNER JOIN ([Orders] O
INNER JOIN Employees C
ON O.EmployeeID=C.EmployeeID
)
ON OD.OrderID=O.OrderID) Ventas
--Where Empleado='Buchaman Steven' and ProductID='31'
GROUP BY Empleado,Productid) ventas1
PIVOT(SUM(total) FOR [Producto] IN ([Alice Mutton],[Filo Mix],[Flotemysost],
[Geitost],[Konbu],[Maxilaku],[Pavlova],[Tofu],[Vegie-spread])) AS pvt
Estos son los resultados, muy resumidos, organizados y bien claros para que tu jefe entienda perfectamente y tome las mejores decisiones, disminuyendo el costo de los procesos de negocio, y desde luego, siendo más productivo. Aquí los resultados...
Ahora comparando ambos resultados te darás cuenta que usar PIVOT con el mejor criterio para resumir y presentar los datos de su empresa, trae consigo beneficios, además de ser fácil de usar y muy práctico por cierto, quize decir, "una buena práctica.
Más información:
Ahora si me guardo (esperando haber contribuido a aclarar este tema).
Saludos,
Percy Reyes.