Använd crosstab()
från tilläggsmodulen tablefunc.
Den specifika svårigheten här är att "radnamnet" består av två kolumner. Jag sammanfogar för syftet med frågan och visar inte den sammanlänkade kolumnen i slutet.
Antar fn
och ln
är NOT NULL
. Otestad:
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);
Ett annat alternativ skulle vara att lägga till ett surrogat "radnamn" med en fönsterfunktion som dense_rank()
och behandla de två definierande kolumnerna som "extra kolumner". Exempel:
- Postgresql-korstabellsfråga med flera "radnamn"-kolumner
Grunderna:
- PostgreSQL Crosstab Query