Následující dotaz by vám měl poskytnout to, co chcete:
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
Chcete-li pochopit, proč získáváte neočekávané výsledky, zkuste dotaz bez GROUP BY
klauzule:
SELECT Store, Sold, [John], [Jim], [Alex]
FROM
#Foo
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
Výstup:
Store Sold John Jim Alex
Harrisburg 20,00 20,00 10,00 NULL
Seattle 20,00 NULL 10,00 10,00
Nyní zkuste totéž znovu s druhou verzí ukázkových dat:
Výstup:
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
Porovnáním 2 různých sad výsledků můžete jasně vidět, že PIVOT
probíhá pro každou kombinaci sloupců, které se jí neúčastní, tj. pro každou kombinaci Store
, Sold
.
V prvním případě je pouze Harrisburg,20,00
a Seattle,20,00
. Proto v tomto případě získáte pouze dva řádky. V druhém případě máte celkem 3 + 2 =5 kombinací.
Nyní můžete vidět, proč GROUP BY
funguje pouze v druhém případě.