Po pierwsze, crosstab()
rodzina funkcji nie jest instalowana w standardowym PostgreSQL. Musisz zainstalować rozszerzenie tablefunc
dla tego. W PostgreSQL 9.1 po prostu:
CREATE EXTENSION tablefunc;
W przypadku starszych wersji spójrz na tę powiązaną odpowiedź.
Zapytanie
Zapytanie może wyglądać tak:
SELECT *
FROM crosstab (
'SELECT l.id
,c.column_name
,c.data
FROM custom_columns_table c
JOIN list_table l ON l.id = c.list_id
ORDER BY 1',
'SELECT DISTINCT column_name
FROM custom_columns_table
ORDER BY 1')
AS tbl (
id integer
,email text
,name text
);
Używam formy crosstab()
z dwoma parametrami, ponieważ pozwala to na brakujące atrybuty. Na przykład, gdy dana osoba nie ma adresu e-mail. Wtedy ten formularz zwróci NULL
dla email
kolumna. Szczegółowe wyjaśnienie:
- Kwerendy PostgreSQL Crosstab
Funkcja
Lub utwórz funkcję, aby nie trzeba było podawać listy definicji kolumn dla każdego wywołania:
CREATE OR REPLACE FUNCTION f_mycross(text, text)
RETURNS TABLE (
id integer
,email text
,name text)
AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;
Zadzwoń:
SELECT * FROM f_mycross(
'SELECT l.id
,c.column_name
,c.data
FROM custom_columns_table c
JOIN list_table l ON l.id = c.list_id
ORDER BY 1',
'SELECT DISTINCT column_name
FROM custom_columns_table
ORDER BY 1')