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