A pivot table is a frequently used method of summarizing and displaying especially report data by means of grouping and aggregating values.
For example, given the data from Orders table - OrderID, CustomerID, OrderDate etc., I can create a pivot table to display number of orders per each year listed in the database:
SELECT * FROM (SELECT OrderID, YEAR(OrderDate) As OrderYear FROM Orders) Data PIVOT( COUNT(OrderID) FOR OrderYear IN([2008], [2009], [2010])) As YearlyOrderQty
will produce something like that:
| 2008 | 2009 | 2010 |
| 152 | 408 | 270 |
which would be quite difficult to accomplish without the use of pivot table.
SELECT * FROM (SELECT CustomerID, OrderID, YEAR(OrderDate) As OrderYear FROM Orders) Data PIVOT( COUNT(OrderID) FOR OrderYear IN([2008], [2009], [2010])) As YearlyOrderQty
will produce a list of customers with number of orders for each customer per each year:
| CustomerID | 2008 | 2009 | 20120 |
| ALFKI | 0 | 3 | 3 |
| ANATR | 1 | 2 | 1 |
| ANTON | 1 | 5 | 1 |
| AROUT | 2 | 7 | 4 |
| BERGS | 3 | 10 | 5 |
| BLAUS | 0 | 4 | 3 |
| BLONP | 3 | 7 | 1 |
| BOLID | 1 | 1 | 1 |
The query below is similar to the one just above but it returns Company name instead of Customer ID
SELECT * FROM ( SELECT c.CompanyName, o.OrderID, YEAR(o.OrderDate) As OrderYear FROM Orders as o INNER JOIN Customers as c ON o.CustomerID=c.CustomerID ) Data PIVOT( COUNT(OrderID) FOR OrderYear IN([2008], [2009], [2010])) As YearlyOrderQty
| CompanyName | 2008 | 2009 | 2010 |
| Alfreds Futterkiste | 0 | 3 | 3 |
| Ana Trujillo Emparedados y helados | 1 | 2 | 1 |
| Antonio Moreno Taquería | 1 | 5 | 1 |
| Around the Horn | 2 | 7 | 4 |
| Berglunds snabbköp | 3 | 10 | 5 |
| Blauer See Delikatessen | 0 | 4 | 3 |
| Blondesddsl père et fils | 3 | 7 | 1 |
| Bólido Comidas preparadas | 1 | 1 | 1 |
No comments:
Post a Comment