Použijte crosstab()
z doplňkového modulu tablefunc.
Konkrétní obtížnost zde je, že "název řádku" se skládá ze dvou sloupců. Pro účely dotazu zřetězím a nezobrazuji zřetězený sloupec na konci.
Za předpokladu fn
a ln
NOT NULL
. Netestováno:
SELECT fn, ln, cat1, cat2
FROM crosstab(
'SELECT fn || ln AS row_name, fn, ln, file_type, attribute
FROM t
ORDER BY fn, ln, file_type'
,$$VALUES ('cat1'::text), ('cat2')$$)
AS t (row_name text, fn text, ln int, cat1 text, cat2 text);
Další možností by bylo přidat náhradní "název řádku" s funkcí okna, jako je dense_rank()
a zacházet s definujícími dvěma sloupci jako s "nadbytečnými sloupci". Příklad:
- Křížový dotaz Postgresql s více sloupci „název řádku“
Základy:
- PostgreSQL Crosstab Query