Tout d'abord, le crosstab()
famille de fonctions n'est pas installée dans PostgreSQL standard. Vous devez installer l'extension tablefunc
pour ça. Dans PostgreSQL 9.1, vous feriez simplement :
CREATE EXTENSION tablefunc;
Pour les versions plus anciennes, consultez cette réponse connexe.
Requête
La requête pourrait ressembler à ceci :
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
);
J'utilise la forme de crosstab()
avec deux paramètres, car cela permet des attributs manquants. Comme, quand une personne n'a pas d'e-mail. Ensuite, ce formulaire renverra NULL
pour le email
colonne. Explication détaillée :
- Requête croisée PostgreSQL
Fonction
Ou créez une fonction pour ne pas avoir à fournir une liste de définition de colonne pour chaque appel :
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;
Appel :
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')