ピボット クエリの説明
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
これらは、ピボットの「ベース データ」になる列です。何もしない列を含めないでください。非 GROUP BY 列を SELECT 句に入れないように、未使用の列を PIVOT ソースにリストアップしません。
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
この部分は、「Val1」から「Val5」という名前の 5 つの新しい列を作成していることを示しています。これらの列名は値を表します Valの列に。したがって、テーブルには次のようなものが含まれることが期待されます
otherID Val amount
1 Val1 1
2 Val2 2
1 Val3 3
1 Val1 5
(etc) (this column contains one of Val1 - Val5, or null)
これで、以前には存在しなかった 5 つの新しい列ができました。列には何が入りますか?
- ピボットされた列ではない OUTPUT に表示される列は、「GROUP BY」列です。
- 集計関数は、GROUP BY 列と PIVOTED 列の間の CROSS であるセルにすべてのデータを収集するものです。
上記のサンプル データを使用して説明すると、otherID=1 と val=Val1 があります。出力テーブルには、各 (otherID/val) の組み合わせについて、この Max(amount) の組み合わせを表すセルが 1 つだけあります
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
<x>
とマークされたセルの場合 、許可される値は 1 つだけなので、 <x>
複数の amount
を含めることはできません 値。これが、この場合は MAX(amount)
を使用して集計する必要がある理由です。 .実際、出力は次のようになります
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
SELECT ステートメントは、これらの列を出力するものです
SELECT OtherID, Val1, Val2, Val3, Val4, Val5