- カテゴリ:
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 } NULLSname_columnに NULLs のある行を含めるか除外するかを指定します。INCLUDE NULLSの場合は、 NULLs のある行が含まれます。EXCLUDE NULLSの場合は、 NULLs のある行が除外されます。
デフォルト:
EXCLUDE NULLSvalue_column生成列に割り当てる名前。列リスト内の列の値が入力されます。
name_column生成列に割り当てる名前。列リスト内の列の名前が入力されます。
column_list単一のピボット列に転置されるソーステーブルまたはサブクエリの列の名前。列名には
name_columnが入力され、列値にはvalue_columnが入力されます。column_listにはリテラル列名のみを含めることができ、サブクエリを含めることはできません。column_listの列は、以下の例外を除き、まったく同じデータ型にする必要があります。文字列のデータ型 は、異なる長さにすることができます。
列が文字列を含む場合は、列ごとに異なるデータ型をテキストに使用することができます。たとえば、リストには VARCHAR 列と CHAR 列を含めることができます。
例¶
以下の構造とデータを持つテーブル、 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 | +-------------+-------+-------+