Poniższe zapytanie powinno dać ci to, czego chcesz:
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
Aby zrozumieć, dlaczego otrzymujesz nieoczekiwane wyniki, wypróbuj zapytanie bez GROUP BY
klauzula:
SELECT Store, Sold, [John], [Jim], [Alex]
FROM
#Foo
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
Wyjście:
Store Sold John Jim Alex
Harrisburg 20,00 20,00 10,00 NULL
Seattle 20,00 NULL 10,00 10,00
Teraz spróbuj to samo ponownie z drugą wersją przykładowych danych:
Wyjście:
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
Porównując 2 różne zestawy wyników, możesz wyraźnie zobaczyć, że PIVOT
ma miejsce dla każdej kombinacji kolumn, które w niej nie uczestniczą, tj. dla każdej kombinacji Store
, Sold
.
W pierwszym przypadku jest tylko Harrisburg,20,00
i Seattle,20,00
. Dlatego w tym przypadku otrzymujesz tylko dwa rzędy. W drugim przypadku masz w sumie 3 + 2 =5 kombinacji.
Teraz możesz zobaczyć, dlaczego GROUP BY
działa tylko w drugim przypadku.