- カテゴリ:
PIVOT¶
入力式の1つの列の一意の値を複数の列に変換し、必要に応じて残りの列の値で結果を集計することにより、テーブルを回転します。クエリでは、テーブル名またはサブクエリの後の FROM 句で指定されます。
PIVOT は次の :doc:` 組み込み集計関数 </sql-reference/functions-aggregation>` をサポートします。
PIVOT を使用すると、幅の狭いテーブル(例: empid、 month、 sales)を幅の広いテーブル(例: empid、 jan_sales、 feb_sales、 mar_sales)に変換することができます。
- こちらもご参照ください。
構文¶
パラメーター¶
aggregate_functionpivot_columnのグループ化された値を結合するための集約関数。pivot_column [ [ AS ] alias ]集計されるソーステーブルまたはサブクエリの列。
オプションの
[ AS ] alias句は、 PIVOT操作の結果で集約に使用するエイリアスを指定します。各ピボット列名には、アンダースコアとエイリアスが付加されます。例えば、aliasがtotalの場合、ピボット操作ではピボット列名に_TOTALが追加されます。キーワード AS はオプションです。value_column列名の生成元となる値を含むソーステーブルまたはサブクエリの列。
pivot_value_N [ [ AS ] alias ]クエリ結果の見出しにピボットするピボット列の値のリスト。
オプションの
[ AS ] alias句は、 PIVOT操作の結果で値に使用するエイリアスを指定します。エイリアスは値を置き換えます。ANY [ ORDER BY ... ]ピボット列のすべての異なる値でピボットします。出力でのピボット列の順序を制御するには、 ANY キーワードの後に ORDER BY 句を指定します。ピボット列に NULLs が含まれている場合は、 NULL もピボット値として扱われます。
subqueryサブクエリで見つかったすべての値をピボットします。サブクエリに ORDER BY 句が含まれる場合は、 DISTINCT キーワードが必要です。サブクエリは、単一の列を返す非相関サブクエリにする必要があります。ピボット処理は、サブクエリによって返されるすべての異なる値に対して実行されます。非相関サブクエリについては、 サブクエリの操作 をご参照ください。
DEFAULT ON NULL(value)ピボット結果の NULL 値をすべて指定のデフォルト値に置換します。デフォルト値には、ピボット列および集計列に依存しない任意のスカラー式を指定できます。
使用上の注意¶
Snowflakeは ダイナミックピボット をサポートしています。ダイナミックピボットクエリでは、ピボット値を明示的に指定する代わりに、PIVOT サブ句で ANY キーワードまたはサブクエリを使用します。
ビュー の定義でダイナミック・ピボットが使用されている場合、ピボット出力列を変更するための変更を基礎データに行うと、ビューでのクエリが失敗する場合があります。
ダイナミックピボットは、ストアドプロシージャまたはユーザー定義関数(UDF)の本文ではサポートされていません。
ダイナミックピボットを使用しないピボットクエリでは、列が重複して出力されることがあります。列が重複した出力は避けることをお勧めします。ダイナミックピボットクエリは、重複列を削除します。
ダイナミックピボットを使用しないピボットクエリで、 VARIANT 列を別のデータ型に CAST しようとすると、失敗することがあります。ダイナミックピボットクエリにはこの制限がありません。
現在、 PIVOT セマンティックでは複数の集計はできませんが、 PIVOT と UNION 演算子 を併用すると、同様の結果を得ることができます。例については、 UNION を使用した複数の集計によるダイナミックピボット をご参照ください。
例¶
PIVOT 例では、次の quarterly_sales テーブルを使用します。
次の例では、 PIVOT を使用します。
すべての異なる列の値に対する自動ダイナミックピボット¶
指定のテーブル quarterly_sales で、 ANY キーワードを使用して amount 列でピボットし、各四半期すべての従業員1人あたりの合計売上を合計し、 ORDER BY を指定して、ピボット列が順に並ぶようにします。
以下の例は前の例と同じですが、各ピボット列名にエイリアス _TOTAL を付加します。
サブクエリを使用した列値に対するダイナミックピボット¶
quarterly_sales テーブルに加えて、 ad_campaign_types_by_quarter テーブルが特定の四半期に実施された広告の種類を追跡していると仮定します。このテーブルには以下のような構造とデータがあります。
ピボットクエリでサブクエリを使用すると、特定の広告キャンペーンを実施した四半期の売上の合計を求めることができます。たとえば、次のピボットクエリは、テレビ広告キャンペーンを実施した四半期のみのデータを返します。
UNION を使用した複数の集計によるダイナミックピボット¶
UNION 演算子 を使用すると、1つの結果セットに複数の集計を表示できます。この例では、ダイナミックピボットと UNION 演算子を使用して、各四半期の各従業員の以下の情報を表示します。
クエリを実行します。
結合クエリを使用したダイナミックピボット¶
結合を使用したクエリでピボットを実行するには、 共通テーブル式(CTE) をピボットクエリに使用します。
たとえば、従業員と管理者をマッピングした単純なテーブルがあるとします。
emp_manager テーブルと quarterly_sales テーブルを結合し、 quarterly_sales テーブルの amount 列をピボットするクエリを実行します。
指定したピボット列の列値のリストでピボットします。¶
指定のテーブル quarterly_sales で、 amount 列をピボットで使用して、指定した四半期の従業員1人あたりの売上合計を求めます。
以下のクエリを実行すると、 amount 列のすべての四半期でピボットを実行できます。
AS 句を使用すると、出力の列名を変更できます。たとえば、列名を短くし、引用符なしで表示するには、以下のクエリを実行します。
NULL 値のデフォルト値を使用したピボット¶
クエリが NULL の値を返す場合は、 DEFAULT ON NULL を使用してデフォルト値に置き換えることができます。たとえば、以下のクエリを実行すると、ダイナミックピボットを使用して、 NULL 値をデフォルト値 0 に置き換えることができます。
列のリストを指定して DEFAULT ON NULL を使うこともできます。
複数の列を含むピボットの例¶
ピボットクエリは複数の列を扱うことができます。これらの例を実行する前に、 quarterly_sales テーブルに列を追加し、その列にランダムな値を入力します。
まず、 quarterly_sales テーブルに、各販売に適用された割引を追跡する列を追加します。
新しい列には、 0 から 5 の間のランダムな値を入力します。これは、各販売の割引率を指定します。
テーブルをクエリし、ランダムな値が追加された新しい列を表示します。
新しい列が追加され、入力されたため、以下の例を実行します。
CTE を使用したピボットクエリから列を除外する¶
共通テーブル式(CTE) を使用すると、ピボットクエリから列を除外できます。
以下の例では、 CTE を使用して、ピボットクエリから discount_percent 列を除外します。
CTE を使用して amount 列を除外し、各四半期における各従業員が提供した平均割引額を表示します。
多次元ピボットクエリを実行する¶
多次元ピボットクエリは、複数の列をピボット処理します。この例では、 amount 列と discount_percentage 列をピボットします。このクエリは、各四半期の全従業員による全販売額の合計と、各四半期の全販売の最大割引率を返します。
クエリでは、 SELECT リストは $col_position パラメーターを使用して、返された列に対して SUM と MAX 関数を順番に実行し、返された列に名前を付けます。FROM 句のサブクエリは、ピボット操作のデータを提供します。出力には全従業員の販売結果が表示されるため、サブクエリには empid 列が含まれません。