Wyjaśnienie zapytania przestawnego
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Są to kolumny, które stają się „danymi bazowymi” dla elementu przestawnego. Nie dołączaj kolumn, które nic nie robią. Tak jak nie umieszczasz kolumn innych niż GROUP BY w klauzuli SELECT, nie wymieniasz nieużywanych kolumn w źródle PIVOT.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Ta część mówi, że tworzysz 5 nowych kolumn o nazwach „Val1” do „Val5”. Te nazwy kolumn reprezentują wartości w kolumnie Wał. Oczekuje się więc, że Twoja tabela będzie zawierać coś takiego
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)
Masz teraz 5 nowych kolumn, które wcześniej nie istniały. Co trafia do kolumny?
- Każda kolumna, która pojawia się w OUTPUT, która nie jest kolumną przestawną, jest kolumną „GROUP BY”.
- Funkcja agregująca zbiera wszystkie dane w komórce, która jest KRZYŻYKIEM między kolumnami GROUP BY i PIVOTED.
Tak więc, aby zilustrować, używając przykładowych danych powyżej, mamy otherID=1 i val=Val1. W tabeli wyjściowej jest tylko jedna komórka reprezentująca tę kombinację Max(amount) dla każdej kombinacji (inneID/val)
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
Dla komórki oznaczonej <x>
, dozwolona jest tylko jedna wartość, więc <x>
nie może zawierać wielu amount
wartości. To jest powód, dla którego musimy to zagregować, w tym przypadku używając MAX(amount)
. W rzeczywistości wynik wygląda tak
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
Polecenie SELECT wyświetla te kolumny
SELECT OtherID, Val1, Val2, Val3, Val4, Val5