Du kan ikke have en "dynamisk" pivot, da antallet, navnene og datatyperne for alle kolonner i en forespørgsel skal være kendt af databasen før forespørgslen udføres faktisk (dvs. på parsetidspunkt).
Jeg synes, det er lettere at håndtere ting at samle ting i en JSON.
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
Hvis din frontend kan håndtere JSON-værdier direkte, kan du stoppe her.
Hvis du virkelig har brug for en visning med én kolonne pr. attribut, kan du bruge dem fra JSON-værdien:
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
Jeg synes, det er lidt nemmere at administrere, når nye attributter tilføjes.
Hvis du har brug for en visning med alle etiketter, kan du oprette en lagret procedure for dynamisk at oprette den. Hvis antallet af forskellige etiketter ikke ændres for ofte, kan dette være 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;
Opret derefter visningen ved hjælp af:
call create_customer_view();
Og i din kode skal du bare bruge:
select *
from customer_properties;
Du kan planlægge denne procedure til at køre med regelmæssige intervaller (f.eks. gennem en cron
job på Linux)