En primer lugar, la crosstab()
La familia de funciones no está instalada en PostgreSQL estándar. Necesitas instalar la extensión tablefunc
para esto. En PostgreSQL 9.1 simplemente:
CREATE EXTENSION tablefunc;
Para versiones anteriores, eche un vistazo a esta respuesta relacionada.
Consulta
La consulta podría verse así:
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
);
Uso la forma de crosstab()
con dos parámetros, porque eso permite que falten atributos. Como cuando una persona no tiene correo electrónico. Entonces este formulario devolverá NULL
para el email
columna. Explicación detallada:
- Consulta de tabulación cruzada de PostgreSQL
Función
O cree una función para que no tenga que proporcionar una lista de definición de columna para cada llamada:
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;
Llamar:
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')