Обяснение на обобщената заявка
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Това са колоните, които се превръщат в "базови данни" за обобщената точка. Не включвайте колони, които не правят нищо. Точно както не поставяте колони, които не са GROUP BY в клаузата SELECT, вие не изброявате неизползваните колони в източник на PIVOT.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Тази част казва, че създавате 5 нови колони с име "Val1" до "Val5". Тези имена на колони представляват стойности в колоната Вал. Така че се очаква вашата таблица да съдържа нещо подобно
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)
Така че сега имате 5 нови колони, които не са съществували преди. Какво влиза в колоната?
- Всяка колона, която се появява в OUTPUT, която не е PIVOTed колона, е колона „GROUP BY“.
- Агрегираната функция е това, което събира всички данни в клетката, която е КРЪСТЪТ между колоните GROUP BY и колоната PIVOTED.
И така, за илюстрация, използвайки примерните данни по-горе, имаме otherID=1 и val=Val1. В изходната таблица има само една клетка, представляваща тази комбинация от Max(amount) за всяка комбинация (otherID/val)
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
За клетката, отбелязана с <x>
, е разрешена само една стойност, така че <x>
не може да съдържа множество amount
стойности. Това е причината, поради която трябва да го обобщим, в този случай използвайки MAX(amount)
. Така че всъщност резултатът изглежда така
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
Операторът SELECT е това, което след това извежда тези колони
SELECT OtherID, Val1, Val2, Val3, Val4, Val5