Kueri berikut akan memberikan apa yang Anda inginkan:
SELECT Store,
TotalSold,
[John] AS WastedByJohn,
[Jim] AS WastedByJim,
[Alex] AS WastedByAlex
FROM (SELECT Store, Employee, Waste,
SUM(Sold) OVER (PARTITION BY Store) AS TotalSold
FROM #Foo) src
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
Untuk memahami mengapa Anda mendapatkan hasil yang tidak diharapkan, coba kueri Anda tanpa GROUP BY
klausa:
SELECT Store, Sold, [John], [Jim], [Alex]
FROM
#Foo
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
Keluaran:
Store Sold John Jim Alex
Harrisburg 20,00 20,00 10,00 NULL
Seattle 20,00 NULL 10,00 10,00
Sekarang, coba hal yang sama lagi dengan data sampel versi kedua:
Keluaran:
Store Sold John Jim Alex
Harrisburg 25,00 10,00 NULL NULL
Harrisburg 30,00 10,00 NULL NULL
Harrisburg 40,00 NULL 10,00 NULL
Seattle 50,00 NULL 10,00 NULL
Seattle 60,00 NULL NULL 10,00
Dengan membandingkan 2 kumpulan hasil yang berbeda, Anda dapat melihat dengan jelas bahwa PIVOT
terjadi untuk setiap kombinasi kolom yang tidak berpartisipasi di dalamnya, yaitu untuk setiap kombinasi Store
, Sold
.
Dalam kasus pertama hanya ada Harrisburg,20,00
dan Seattle,20,00
. Itu sebabnya Anda hanya mendapatkan dua baris dalam kasus ini. Dalam kasus kedua, Anda memiliki total 3 + 2 =5 kombinasi.
Sekarang Anda dapat melihat mengapa GROUP BY
hanya berfungsi dalam kasus kedua.