次のクエリは、必要なものを提供するはずです:
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
次に、サンプル データの 2 番目のバージョンで同じことをもう一度試してください:
出力:
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
.そのため、この場合は 2 行しか取得できません。 2 番目のケースでは、合計 3 + 2 =5 通りの組み合わせがあります。
GROUP BY
の理由がわかります。 2 番目のケースでのみ機能します。