Za prvé, crosstab()
rodina funkcí není ve standardním PostgreSQL nainstalována. Je třeba nainstalovat rozšíření tablefunc
pro tohle. V PostgreSQL 9.1 byste jednoduše:
CREATE EXTENSION tablefunc;
Pro starší verze se podívejte na tuto související odpověď.
Dotaz
Dotaz může vypadat takto:
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
);
Používám tvar crosstab()
se dvěma parametry, protože to umožňuje chybějící atributy. Jako když člověk nemá e-mail. Poté tento formulář vrátí NULL
pro email
sloupec. Podrobné vysvětlení:
- PostgreSQL Crosstab Query
Funkce
Nebo vytvořte funkci, abyste nemuseli pro každé volání dodávat seznam definic sloupců:
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;
Volejte:
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')