Vysvětlení pivotního dotazu
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Toto jsou sloupce, které se stanou "základními daty" pro pivot. Nezahrnujte sloupce, které nic nedělají. Stejně jako do klauzule SELECT nevkládáte sloupce, které nejsou GROUP BY, nevypisujete nepoužívané sloupce ve zdroji PIVOT.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Tato část říká, že vytváříte 5 nových sloupců s názvem "Val1" až "Val5". Tyto názvy sloupců představují hodnoty ve sloupci Val. Očekává se tedy, že váš stůl bude obsahovat něco takového
otherID Val amount
1 Val1 1
2 Val2 2
1 Val3 3
1 Val1 5
(etc) (this column contains one of Val1 - Val5, or null)
Nyní tedy máte 5 nových sloupců, které dříve neexistovaly. Co jde do sloupce?
- Jakýkoli sloupec, který se objeví ve OUTPUT a který není kontingenčním sloupcem, je sloupcem "GROUP BY".
- Agregační funkce je to, co shromažďuje všechna data do buňky, která je KŘÍŽEM mezi sloupci GROUP BY a PIVOTED.
Pro ilustraci tedy pomocí ukázkových dat výše máme otherID=1 a val=Val1. Ve výstupní tabulce je pouze jedna buňka představující tuto kombinaci Max (částka) pro každou kombinaci (otherID/val)
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
Pro buňku označenou <x>
, je povolena pouze jedna hodnota, tedy <x>
nemůže obsahovat více amount
hodnoty. To je důvod, proč jej musíme agregovat, v tomto případě pomocí MAX(amount)
. Takže ve skutečnosti výstup vypadá takto
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
Příkaz SELECT je výstupem těchto sloupců
SELECT OtherID, Val1, Val2, Val3, Val4, Val5