Verwenden Sie crosstab()
aus dem Zusatzmodul tablefunc.
Die spezifische Schwierigkeit Hier ist, dass der "Zeilenname" aus zwei Spalten besteht. Ich verkette zum Zwecke der Abfrage und zeige die verkettete Spalte am Ende nicht an.
Angenommen fn
und ln
sind NOT NULL
. Ungetestet:
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);
Eine andere Option wäre das Hinzufügen eines Ersatz-"Zeilennamens" mit einer Fensterfunktion wie dense_rank()
und behandeln Sie die beiden definierenden Spalten als "zusätzliche Spalten". Beispiel:
- Postgresql-Kreuztabellenabfrage mit mehreren "Zeilennamen"-Spalten
Grundlagen:
- PostgreSQL-Kreuztabellenabfrage