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

PostgreSQLで任意の数の行を列に変換する

    Postgres(およびその他のRDBMS)のピボットテーブルの主な問題は、クエリ結果の構造(列の数と名前)が選択したデータに応じて変化しないことです。考えられる解決策の1つは、データによって構造が定義されるビューを動的に作成することです。サンプル関数は、テーブルexample_tableに基づいてビューを作成します :

    create or replace function create_pivot_view()
    returns void language plpgsql as $$
    declare
        list text;
    begin
        select string_agg(format('jdata->>%1$L "%1$s"', name), ', ')
        from (
            select distinct name
            from example_table
            ) sub
        into list;
    
        execute format($f$
            drop view if exists example_pivot_view;
            create view example_pivot_view as
            select lbl, %s
            from (
                select lbl, json_object_agg(name, value) jdata
                from example_table
                group by 1
                order by 1
                ) sub
            $f$, list);
    end $$;
    

    テーブルが変更された後(おそらくトリガーで)関数を使用し、作成されたビューを照会します:

    select create_pivot_view();
    
    select *
    from example_pivot_view;
    
     lbl | num | colour | percentage 
    -----+-----+--------+------------
       1 | 1   | Red    | 25.0
       2 | 2   | Green  | 50.0
       3 | 3   | Blue   | 75.0
    (3 rows)
    

    db<>fiddleでテストします。

    新しい名前がテーブルに追加された後(またはテーブルから名前が削除された後)にのみ、ビューを再作成する(関数を呼び出す)必要があることに注意してください。個別の名前のセットが変更されない場合は、ビューを再作成せずにクエリを実行できます。セットが頻繁に変更される場合は、一時的なビューを作成することをお勧めします。

    JSONBフィールドから集約されたキーと値のペアをフラット化することにも興味があるかもしれませんか?



    1. PostgreSQLでのATTIMEZONEの動作

    2. MariaDB GROUP_CONCAT()

    3. 条件付き集計のパフォーマンス

    4. SQLServerExpressバックアップデータベース| SQLExpressバックアップの自動化とパージをスケジュールする方法