Først og fremmest crosstab()
familie af funktioner er ikke installeret i standard PostgreSQL. Du skal installere udvidelsen tablefunc
for det. I PostgreSQL 9.1 ville du blot:
CREATE EXTENSION tablefunc;
For ældre versioner, se dette relaterede svar.
Forespørgsel
Forespørgslen kunne se sådan ud:
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
);
Jeg bruger formen crosstab()
med to parametre, fordi det giver mulighed for manglende attributter. Som når en person ikke har nogen e-mail. Så vil denne formular returnere NULL
for email
kolonne. Detaljeret forklaring:
- PostgreSQL krydstabulatorforespørgsel
Funktion
Eller opret en funktion, så du ikke behøver at levere en kolonnedefinitionsliste for hvert opkald:
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;
Ring til:
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')