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

Postgres-行を列に転置

    crosstab()を使用する tablefuncモジュールから。

    SELECT * FROM crosstab(
       $$SELECT user_id, user_name, rn, email_address
         FROM  (
            SELECT u.user_id, u.user_name, e.email_address
                 , row_number() OVER (PARTITION BY u.user_id
                                ORDER BY e.creation_date DESC NULLS LAST) AS rn
            FROM   usr u
            LEFT   JOIN email_tbl e USING (user_id)
            ) sub
         WHERE  rn < 4
         ORDER  BY user_id
       $$
      , 'VALUES (1),(2),(3)'
       ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);
    

    最初のパラメーターにはドル引用符を使用しましたが、これには特別な意味はありません。クエリ文字列で一重引用符をエスケープすると便利です。これは一般的なケースです:

    • PostgreSQLで一重引用符でテキストを挿入

    詳細な説明と手順:

    • PostgreSQLクロス集計クエリ

    特に、「追加の列」の場合:

    • Tablefuncを使用して複数の列をピボットする

    特別な問題 ここにあります:

    • キー名がありません。
      ->row_number()に置き換えます サブクエリで。

    • メールの数はさまざまです。
      ->最大数に制限されています。外側のSELECTの3つのうち
      そしてcrosstab()を使用します 2つのパラメータを使用して、可能なキーのリストを提供します。

    NULLS LASTに注意してください ORDER BYで 。




    1. SQL Serverでテーブルのすべてのチェックキーと外部キーの制約を有効にする方法(T-SQLの例)

    2. SQLite-データをCSVファイルにエクスポート

    3. ストアドプロシージャ内のストアドプロシージャの呼び出し

    4. それぞれが外部キーである要素のPostgreSQL配列