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