クエリのすべての列の数、名前、データ型は前にデータベースに認識されている必要があるため、「動的」ピボットを設定することはできません。 クエリは実際に実行されます(つまり、解析時に)。
ものをJSONに集約する方が扱いやすいと思います。
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
フロントエンドがJSON値を直接処理できる場合は、ここで停止できます。
属性ごとに1つの列を持つビューが本当に必要な場合は、JSON値からそれらを取得できます:
select customer_number,
props ->> 'address' as address,
props ->> 'phone' as phone,
props ->> 'email' as email
from (
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
) t
新しい属性が追加されたときに、これを管理するのが少し簡単だと思います。
すべてのラベルを含むビューが必要な場合は、ストアドプロシージャを作成して動的に作成できます。異なるラベルの数があまり頻繁に変更されない場合、これは解決策である可能性があります:
create procedure create_customer_view()
as
$$
declare
l_sql text;
l_columns text;
begin
select string_agg(distinct format('(props ->> %L) as %I', label, label), ', ')
into l_columns
from the_table;
l_sql :=
'create view customer_properties as
select customer_number, '||l_columns||'
from (
select customer_number, jsonb_object_agg(label, value) as props
from the_table
group by customer_number
) t';
execute l_sql;
end;
$$
language plpgsql;
次に、以下を使用してビューを作成します:
call create_customer_view();
そして、あなたのコードでは、以下を使用してください:
select *
from customer_properties;
そのプロシージャを定期的に実行するようにスケジュールできます(例:cron
Linuxでの仕事)