- カテゴリ:
UNPIVOT¶
列を行に変換することにより、テーブルを回転します。UNPIVOT は、列のリストとともに(テーブルまたはサブクエリから)2つの列を受け入れ、リストで指定された各列の行を生成する関係演算子です。クエリでは、テーブル名またはサブクエリの後の FROM 句で指定されます。
PIVOT による集計は取り消すことができないため、 UNPIVOT は PIVOT の真逆ではありません。
この演算子を使用して、幅の広いテーブル(例: empid
、 jan_sales
、 feb_sales
、 mar_sales
など)を幅の狭いテーブル(例: empid
、 month
、 sales
)に変換できます。
- こちらもご参照ください。
構文¶
SELECT ...
FROM ...
UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ]
( <value_column>
FOR <name_column> IN ( <column_list> ) )
[ ... ]
パラメーター¶
{ INCLUDE | EXCLUDE } NULLS
name_column
に NULLs のある行を含めるか除外するかを指定します。INCLUDE NULLS
の場合は、 NULLs のある行が含まれます。EXCLUDE NULLS
の場合は、 NULLs のある行が除外されます。
デフォルト:
EXCLUDE NULLS
value_column
生成列に割り当てる名前。列リスト内の列の値が入力されます。
name_column
生成列に割り当てる名前。列リスト内の列の名前が入力されます。
column_list
単一のピボット列に転置されるソーステーブルまたはサブクエリの列の名前。列名には
name_column
が入力され、列値にはvalue_column
が入力されます。column_list
にはリテラル列名のみを含めることができ、サブクエリを含めることはできません。
例¶
以下の構造とデータを持つテーブル、 monthly_sales
を作成します。
CREATE OR REPLACE TABLE monthly_sales(
empid INT,
dept TEXT,
jan INT,
feb INT,
mar INT,
apr INT
);
INSERT INTO monthly_sales VALUES
(1, 'electronics', 100, 200, 300, 100),
(2, 'clothes', 100, 300, 150, 200),
(3, 'cars', 200, 400, 100, 50),
(4, 'appliances', 100, NULL, 100, 50);
SELECT * FROM monthly_sales;
+-------+-------------+-----+------+------+-----+
| EMPID | DEPT | JAN | FEB | MAR | APR |
|-------+-------------+-----+------+------+-----|
| 1 | electronics | 100 | 200 | 300 | 100 |
| 2 | clothes | 100 | 300 | 150 | 200 |
| 3 | cars | 200 | 400 | 100 | 50 |
| 4 | appliances | 100 | NULL | 100 | 50 |
+-------+-------------+-----+------+------+-----+
個々の月列のピボットを解除し、各従業員に対して month
ごとに単一の sales
値を返します。
SELECT *
FROM monthly_sales
UNPIVOT (sales FOR month IN (jan, feb, mar, apr))
ORDER BY empid;
+-------+-------------+-------+-------+
| EMPID | DEPT | MONTH | SALES |
|-------+-------------+-------+-------|
| 1 | electronics | JAN | 100 |
| 1 | electronics | FEB | 200 |
| 1 | electronics | MAR | 300 |
| 1 | electronics | APR | 100 |
| 2 | clothes | JAN | 100 |
| 2 | clothes | FEB | 300 |
| 2 | clothes | MAR | 150 |
| 2 | clothes | APR | 200 |
| 3 | cars | JAN | 200 |
| 3 | cars | FEB | 400 |
| 3 | cars | MAR | 100 |
| 3 | cars | APR | 50 |
| 4 | appliances | JAN | 100 |
| 4 | appliances | MAR | 100 |
| 4 | appliances | APR | 50 |
+-------+-------------+-------+-------+
前の SELECT ステートメントは、デフォルトで NULLs を除外します。そのため、2月の家電製品の行は結果に含まれていません。結果に NULLs を含めるには、以下の SQL ステートメントを実行します。
SELECT *
FROM monthly_sales
UNPIVOT INCLUDE NULLS (sales FOR month IN (jan, feb, mar, apr))
ORDER BY empid;
+-------+-------------+-------+-------+
| EMPID | DEPT | MONTH | SALES |
|-------+-------------+-------+-------|
| 1 | electronics | JAN | 100 |
| 1 | electronics | FEB | 200 |
| 1 | electronics | MAR | 300 |
| 1 | electronics | APR | 100 |
| 2 | clothes | JAN | 100 |
| 2 | clothes | FEB | 300 |
| 2 | clothes | MAR | 150 |
| 2 | clothes | APR | 200 |
| 3 | cars | JAN | 200 |
| 3 | cars | FEB | 400 |
| 3 | cars | MAR | 100 |
| 3 | cars | APR | 50 |
| 4 | appliances | JAN | 100 |
| 4 | appliances | FEB | NULL |
| 4 | appliances | MAR | 100 |
| 4 | appliances | APR | 50 |
+-------+-------------+-------+-------+
この出力には、2月の家電製品の行が含まれています。
すべての列を *
で選択するのではなく、特定の列を SELECT リストに含めて、 UNPIVOT value_column
と name_column
を参照することができます。次の例は前の例と似ていますが、 SELECT リストで value_column
sales
と name_column
month
を指定しています。このクエリは empid
列を除外しています。
SELECT dept, month, sales
FROM monthly_sales
UNPIVOT INCLUDE NULLS (sales FOR month IN (jan, feb, mar, apr))
ORDER BY dept;
+-------------+-------+-------+
| DEPT | MONTH | SALES |
|-------------+-------+-------|
| appliances | JAN | 100 |
| appliances | FEB | NULL |
| appliances | MAR | 100 |
| appliances | APR | 50 |
| cars | JAN | 200 |
| cars | FEB | 400 |
| cars | MAR | 100 |
| cars | APR | 50 |
| clothes | JAN | 100 |
| clothes | FEB | 300 |
| clothes | MAR | 150 |
| clothes | APR | 200 |
| electronics | JAN | 100 |
| electronics | FEB | 200 |
| electronics | MAR | 300 |
| electronics | APR | 100 |
+-------------+-------+-------+