Следната заявка трябва да ви даде това, което искате:
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
За да разберете защо получавате неочаквани резултати, опитайте заявката си без GROUP BY
клауза:
SELECT Store, Sold, [John], [Jim], [Alex]
FROM
#Foo
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
Изход:
Store Sold John Jim Alex
Harrisburg 20,00 20,00 10,00 NULL
Seattle 20,00 NULL 10,00 10,00
Сега опитайте същото отново с втората версия на примерни данни:
Изход:
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
Чрез сравняване на 2 различни набора от резултати можете ясно да видите този PIVOT
се извършва за всяка комбинация от колони, които не участват в нея, т.е. за всяка комбинация от Store
, Sold
.
В първия случай има само Harrisburg,20,00
и Seattle,20,00
. Ето защо в този случай получавате само два реда. Във втория случай имате общо 3 + 2 =5 комбинации.
Вече можете да видите защо GROUP BY
работи само във втория случай.