Hlavním problémem kontingenčních tabulek v Postgresu (a dalších RDBMS) je to, že struktura (počet a názvy sloupců) výsledku dotazu se nemůže lišit v závislosti na vybraných datech. Jedním z možných řešení je dynamické vytvoření pohledu, jehož struktura je definována daty. Ukázková funkce vytvoří pohled na základě tabulky 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 $$;
Použijte funkci po úpravě tabulky (možná ve spouštěči) a dotazujte se na vytvořený pohled:
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)
Otestujte to v db<>fiddle.
Všimněte si, že je nutné znovu vytvořit pohled (zavolat funkci) až poté, co je do tabulky přidán nový název (nebo je z ní nějaké jméno odstraněno). Pokud se sada odlišných názvů nezmění, můžete dotazovat pohled, aniž byste jej znovu vytvořili. Pokud je sada často upravována, bylo by lepší vytvořit dočasné zobrazení.
Také by vás mohlo zajímat Sloučit agregované páry klíč/hodnota z pole JSONB?