SQLでのPivotとUnpivotの使い方


Pivotの使い方: Pivotを使用すると、行の値を列として表示することができます。具体的な例を見てみましょう。

例えば、以下のようなテーブルがあるとします:

テーブル名: Sales
+-------+-------+-------+------+
| 月    | 商品  | 売上  | 利益 |
+-------+-------+-------+------+
| 1月   | A     | 100   | 10   |
| 1月   | B     | 200   | 20   |
| 2月   | A     | 150   | 15   |
| 2月   | B     | 250   | 25   |
+-------+-------+-------+------+

この表を「月」を基準にPivotして、「商品」ごとの売上と利益を表示したい場合、次のようなクエリを使用します:

SELECT *
FROM Sales
PIVOT (
  SUM(売上) AS 売上,
  SUM(利益) AS 利益
  FOR 商品 IN ([A], [B])
) AS PivotTable

上記のクエリでは、FOR句でPivotする列を指定し、SUM関数を使用して集計を行っています。結果は以下のようになります:

+-------+------+-------+-------+-------+
| 月    | A_売上 | A_利益 | B_売上 | B_利益 |
+-------+------+-------+-------+-------+
| 1月   | 100  | 10    | 200  | 20    |
| 2月   | 150  | 15    | 250  | 25    |
+-------+------+-------+-------+-------+

Unpivotの使い方: Unpivotは、Pivotの逆の操作を行います。列を行に変換することで、データを簡素化したり、集計したりすることができます。以下に例を示します。

例えば、以下のようなPivotされたテーブルがあるとします:

テーブル名: PivotTable
+-------+------+-------+------+-------+
| 月    | A_売上 | A_利益 | B_売上 | B_利益 |
+-------+------+-------+------+-------+
| 1月   | 100  | 10    | 200  | 20    |
| 2月   | 150  | 15    | 250  | 25    |
+-------+------+-------+------+-------+

この表をUnpivotして、「商品」と「売上」「利益」の列を持つテーブルに変換したい場合、次のようなクエリを使用します:

SELECT 月, 商品, 値
FROM PivotTable
UNPIVOT (
  値 FOR 商品 IN (A_売上, A_利益, B_売上, B_利益)
) AS UnpivotTable

上記のクエリでは、UNPIVOT句でUnpivotする列とその列の値を指定しています。結果は以下のようになります:


+-------+--------+-----+
| 月    | 商品   | 値  |
+-------+--------+-----+
| 1月   | A_売上 | 100 |
| 1月   | A_利益 | 10  |
| 1月   | B_売上 | 200 |
| 1月   | B_利益 | 20  |
| 2月   | A_売上 | 150 |
| 2月   | A_利益 | 15  |
| 2月   | B_売上 | 250 |
| 2月   | B_利益 | 25  |
+-------+--------+-----+

以上が、SQLでのPivotとUnpivotの使い方の例です。これらの機能を使うことで、データの変換や集計を簡単に行うことができます。是非、実際のデータ操作でお試しください。