sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLで列を動的に生成する

    例の基本的なクロス集計クエリは単純です:

    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段階のワークフローを使用します。

    1. 関数にクロス集計クエリテキストを生成させます。ここで提供されている機能を使用できます(そしてニーズに合わせて調整できます!):

      • 動的クロス集計クエリを実行する

      特に、GROUP BY 1, 2を削除します 、クロス集計の前に行を集約しないため。

    2. 生成された関数を実行します。

    完全を期すために、新しい\crosstabviewもあります Postgresのpsqlのメタコマンド9.6 (リリースされたばかり)-同様の機能を備えており、動的な列名を表示できます(動的な名前の添付は、Postgresサーバーではなくpsqlクライアントで行われます)。




    1. Azureの自動化メソッド

    2. JDBCバッチ挿入のパフォーマンス

    3. 再帰CTEで重複アイテムを検出する

    4. SQL Serverチュートリアル–Transact-SQLをマスターするために必要なすべて