SQL know-how

Kontakt


Hidtil kunne man gruppere elementer i SQL udtræk, men PIVOT tilbyder to dimensionale gruppering af elementer i SQL udtræk.  Den samme type som man kander fra Excels PIVOT tabeller eller en matrix kontrol fra Reporting Services.

For eksemplet bruger vi ”Northwind” databasen, har du ikke den, kan hentes fra følgende adresse: http://sql.yaha.dk/NorthwindAndPubs/InstallNorthwindAndPubs.html

Nedenstående udtræk laver en oversigt over hvilken sælger har sold hvilket produkt til hvilken kunde:

SELECT e.firstName,c.CompanyName
 FROM Employees e
 JOIN Orders o ON e.employeeID=o.employeeID
 JOIN Customers c ON c.customerID=o.customerID
 
ORDER BY e.firstName,c.CompanyName

 

Når man eksekverer utrykt, få man en oversigt med masse gentagelse i listen. Det vi kunne ønsker os, var at få fat i vil summering af kunder og sælger, der har været involveret i salg og køb af produkterne. For at opnå dette vi inkludere COUNT funktion plus GROUP BY klausul til udtrykket.

SELECT e.firstName,c.CompanyName, COUNT(o.orderID)
 FROM Employees e
 JOIN Orders o ON e.employeeID=o.employeeID
 JOIN Customers c ON c.customerID=o.customerID
 GROUP BY e.firstName,c.CompanyName
 
ORDER BY e.firstName,c.CompanyName

 

Nu forsøger vi at tag den ny PIVOT funktion i brug. I første omgange vi prøve en simpelt SQL udtryk, vi brugere ”Orders” tabellen, da vi vide på forhånd at der kun er 9 sælger er involveret i salget, bruge vi tallet 1-9 til at repræsentere ”employeeID”:

SELECT * FROM Orders
 
PIVOT (COUNT(employeeID) FOR employeeID IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])) p

Udtrækket er resultatet af PIVOT funktionen og ikke tabellen Orders. Funktionen returnerer alle feltet fra tabellen ”Orders” undtagen ”employeeID”. Feltet er fjende da den er basis for COUNT funktionen i udtrækket.

For at funktionen PIVOT viser sin stykke, vi giver en forståelig navn for hver tal i vores forrige udtræk og forbinder det med tabellen ”customers”, for at se hvem har købet produkterne af hvem:

SELECT c.companyName,
 
[1] as [Nancy],
 
[2] as [Andrew],
 
[3] as [Janet],
 
[4] as [Margaret],
 
[5] as [Steven],
 
[6] as [Michael],
 
[7] as [Robert],
 
[8] as [Laura],
 
[9] as [Anne]
 FROM
(SELECT customerID,employeeID FROM Orders) o
 
PIVOT (COUNT(employeeID) FOR employeeID IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])) p
 
JOIN Customers c ON p.customerID=c.customerID
 ORDER BY c.CompanyName

Som man se X akslen nu repræsentere kunderne og Y akslen repræsentere sælger og vi kan samtidig se hvor mange der er solgt til hver kunde.

Start