Użyj crosstab() z dodatkowego modułu tablefunc.
konkretna trudność tutaj jest to, że "nazwa wiersza" składa się z dwóch kolumn. Łączę na potrzeby zapytania i nie wyświetlam połączonej kolumny na końcu.
Zakładając fn i ln są NOT NULL . Nieprzetestowane:
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);
Inną opcją byłoby dodanie zastępczej „nazwy wiersza” z funkcją okna, taką jak dense_rank() i traktuj definiujące dwie kolumny jako "kolumny dodatkowe". Przykład:
- Zapytanie krzyżowe Postgresql z wieloma kolumnami „nazwa wiersza”
Podstawy:
- Kwerendy PostgreSQL Crosstab