Primeiro, o
crosstab()
família de funções não está instalada no PostgreSQL padrão. Você precisa instalar a extensão tablefunc
por esta. No PostgreSQL 9.1 você simplesmente:CREATE EXTENSION tablefunc;
Para versões mais antigas, dê uma olhada nesta resposta relacionada.
Consulta
A consulta poderia ficar assim:
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
);
Eu uso a forma de
crosstab()
com dois parâmetros, porque isso permite atributos ausentes. Tipo, quando uma pessoa não tem e-mail. Então este formulário retornará NULL
para o email
coluna. Explicação detalhada:- Consulta de tabela cruzada PostgreSQL
Função
Ou crie uma função para não precisar fornecer uma lista de definição de coluna para cada chamada:
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;
Ligar:
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')