- カテゴリ:
UNPIVOT¶
列を行に変換することにより、テーブルを回転します。UNPIVOT は、列のリストとともに(テーブルまたはサブクエリから)2つの列を受け入れ、リストで指定された各列の行を生成する関係演算子です。クエリでは、テーブル名またはサブクエリの後の FROM 句で指定されます。
PIVOTによる集計を取り消すことはできないため、UNPIVOTはPIVOTの正確な逆関数ではありません。
この演算子を使用して、幅の広いテーブル(例: empid、 jan_sales、 feb_sales、 mar_sales など)を幅の狭いテーブル(例: empid、 month、 sales)に変換できます。
- こちらもご参照ください。
構文¶
パラメーター¶
{ 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 列を含めることができます。
[ AS ] col_aliasUNPIVOT 操作の結果で、元の列名の代わりに使用する列エイリアスを指定します。同じ列名に異なるエイリアスを使用することはできません。ただし、複数の列名に同じエイリアスを使うことはできません。キーワード AS はオプションです。
使用上の注意¶
:doc:`LATERAL結合</sql-reference/constructs/join-lateral>`を使用して、UNPIVOT操作の結果セットを直接参照することはできません。これを実行しようとすると、エラーが返されます。回避策として、最初にUNPIVOTの結果を仮テーブルに実体化し、次にLATERAL結合でそのテーブルを参照します。この例で選択されている``monthly_sales``テーブルを作成してロードする方法については、:ref:`例のセクション<label-unpivot-examples>`を参照してください。
LATERALはUNPIVOT結果セットを直接参照できないため、次のクエリは機能しません。
次のCREATETEMPORARYTABLEステートメントは、UNPIVOTの結果を実体化するための仮テーブルを作成します。そのステートメントに続くクエリは、LATERAL結合で仮テーブルを参照します。
例¶
以下の構造とデータを持つテーブル、 monthly_sales を作成します。
個々の月列のピボットを解除し、各従業員に対して month ごとに単一の sales 値を返します。
次の例は前の例と同じですが、列名にエイリアスを使用しています。
前の SELECT ステートメントは、デフォルトで NULLs を除外します。そのため、2月の家電製品の行は結果に含まれていません。結果に NULLs を含めるには、以下の SQL ステートメントを実行します。
この出力には、2月の家電製品の行が含まれています。
すべての列を * で選択するのではなく、特定の列を SELECT リストに含めて、 UNPIVOT value_column と name_column を参照することができます。次の例は前の例と似ていますが、 SELECT リストで value_column sales と name_column month を指定しています。このクエリは empid 列を除外しています。