2013. február 5., kedd

PIVOT / UNPIVOT / Tessék ? :)



Sziasztok!


Ha lenne egy felmérés arról, hogy mik azok a mondatok, amiket a legpontosabban mondanának el ugyanúgy az emberek,akkor szerintem a PIVOT fogalma jó eséllyel pályázhatna egy dobogós helyezésre!

Mi a Pivot? "Hááát, megfordítja 90 fokkal az adatokat, és az oszlopokból sorok lesznek, a sorokból meg oszlopok."

Nice.

-  És hogy működik a gyakorlatban?
-  És ha Pivotolok egy táblát, majd azt Unpivotolom (nekem a visszapivotolás sokkal jobban tetszene) akkor az eredeti értékeket kapom vissza vajon, vagy nem?
-  És ...


Nézzük meg:


Készítünk egy játszós táblát (sql2012 szintaktika), ami mondjuk a Snooker játékosokat fogja tárolni, és azt, hogy ezek a profik melyik pontszerző tornát nyerték meg és mennyiszer.

Azok kedvéért elmondom, akik kevésbé szeretik a snookert, hogy minden évben minden tornát megrendeznek, és világbajnokság is minden évben van.

CREATE TABLE Snooker(Nev VARCHAR(35), Torna VARCHAR(40), Menny INT)


INSERT Snooker(Nev,Torna,Menny) VALUES('Sullivan','VB',2),

VALUES('Sullivan','China Open',2),
VALUES('Sullivan','Masters',4),
VALUES('Sullivan','British Open',1), 
VALUES('Trump','Masters',1),
VALUES('Trump','British Open',3),

VALUES('Sullivan','VB',4)


Nézzünk egy alap lekérdezést :

Select * from Snooker

Nev                   Torna             Menny
-------------------------------------------------
Sullivan               VB                 2  
Sullivan               China Open         2
Sullivan               Masters            4
Sullivan               British Open       1
Trump                  Masters            1
Trump                  British Open       3
Sullivan               VB                 4





Nézzünk egy Pivot lekérdezést a Tornákra vonatkozóan:


SELECT Torna,Sullivan,Trump
FROM (
SELECT Nev, Torna, Menny FROM Snooker) abc
PIVOT (SUM(Menny) FOR Nev IN (Sullivan, Trump)) AS pvt
ORDER BY Torna



Torna      Sullivan     Trump 
------------------------------------------------------------------
British Open          1                     3
China Open           2                     NULL
Masters                 4                     1
VB                        6                     NULL


És ezt már lehet is kiexportálni excelbe! :)



Példa az Unpivotra:

SELECT Torna,Sullivan,Trump
FROM (
SELECT Nev, Torna, Menny FROM Snooker) abc
PIVOT (SUM(Menny) FOR Nev IN (Sullivan, Trump)) AS pvt
UNPIVOT (Menny FOR Nev IN (Sullivan, Trump))  As unpvt



Név                    Torna           Mennyiség
---------------------------------------------------

Sullivan               VB                 6  
Sullivan               China Open         2
Sullivan               Masters            4
Sullivan               British Open       1
Trump                  Masters            1
Trump                  British Open       3



Konklúzió: Az utolsó példában is lehetett látni, hogy aggregált függvények miatt simán előfordulhat az, hogy a Pivot utána Unpivot nem állítja elő nekünk az eredeti adatokat! 



Hajrá Pivot! :)


Nincsenek megjegyzések:

Megjegyzés küldése