Du kan inte ha en "dynamisk" pivot eftersom antalet, namnen och datatyperna för alla kolumner i en fråga måste vara kända för databasen innan frågan exekveras faktiskt (dvs. vid analystid).
Jag tycker att det är lättare att hantera saker i en JSON.
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
Om din frontend kan hantera JSON-värden direkt kan du sluta här.
Om du verkligen behöver en vy med en kolumn per attribut kan du göra dem från JSON-värdet:
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
Jag tycker att detta är lite lättare att hantera när nya attribut läggs till.
Om du behöver en vy med alla etiketter kan du skapa en lagrad procedur för att dynamiskt skapa den. Om antalet olika etiketter inte ändras för ofta kan detta vara en lösning:
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;
Skapa sedan vyn med:
call create_customer_view();
Och i din kod använd bara:
select *
from customer_properties;
Du kan schemalägga den proceduren så att den körs med regelbundna intervall (t.ex. genom en cron
jobb på Linux)