Nemůžete mít "dynamický" pivot, protože číslo, názvy a datové typy všech sloupců dotazu musí být databázi známé před dotaz se skutečně provede (tj. v době analýzy).
Zjišťuji, že agregování věcí do JSON je jednodušší.
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
Pokud váš frontend umí pracovat s hodnotami JSON přímo, můžete se zastavit zde.
Pokud opravdu potřebujete zobrazení s jedním sloupcem na atribut, můžete je získat z hodnoty 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
Zdá se mi to trochu jednodušší na správu, když jsou přidány nové atributy.
Pokud potřebujete pohled se všemi štítky, můžete vytvořit uloženou proceduru a dynamicky ji vytvořit. Pokud se počet různých štítků příliš často nemění, může to být řešení:
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;
Poté vytvořte pohled pomocí:
call create_customer_view();
A ve svém kódu stačí použít:
select *
from customer_properties;
Tuto proceduru můžete naplánovat tak, aby se spouštěla v pravidelných intervalech (např. pomocí cron
práce na Linuxu)