例の基本的なクロス集計クエリは単純です:
SELECT * FROM crosstab(
'SELECT zoom, day, point
FROM province
ORDER BY 1, 2'
, $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);
しかし、そうではありません 動的な列名または動的な列数を使用します。妥協案として、固定数の列を使用して、先頭の列のみを埋めることができます。基本:
- PostgreSQLクロス集計クエリ
動的?
crosstab_hash
動的な列名については役に立ちません。列定義リストを入力せずに繰り返し使用するためのものですが、動的用ではありません。 列名。例:
- PostgreSQLでクロス集計用の列を動的に生成する
- SQL:行を列に置き換える
真に動的な列名の場合、2つが必要です。 サーバーへの往復。最初のクエリで列名を取得して2番目のクエリを作成するか、カーソル、一時テーブル、またはプリペアドステートメントを作成するか。何をしようとも、往復が2回必要です。 SQLは、呼び出し時に戻りタイプを知りたいと考えています。
「動的」呼び出しに最も近いのは、カスタムのcrosstab_n()
を使用することです。 この関連する回答で定義されている関数:
- CASEおよびGROUPBYを使用してピボットする動的な代替手段
または、完全に動的なクロス集計クエリのアイデアをあきらめて(ご存知のとおり、それは不可能であるため)、上記のような2段階のワークフローを使用します。
-
関数にクロス集計クエリテキストを生成させます。ここで提供されている機能を使用できます(そしてニーズに合わせて調整できます!):
- 動的クロス集計クエリを実行する
特に、
GROUP BY 1, 2
を削除します 、クロス集計の前に行を集約しないため。 -
生成された関数を実行します。
完全を期すために、新しい\crosstabview
もあります Postgresのpsqlのメタコマンド9.6 (リリースされたばかり)-同様の機能を備えており、動的な列名を表示できます(動的な名前の添付は、Postgresサーバーではなくpsqlクライアントで行われます)。