First, the crosstab() family of functions is not installed in standard PostgreSQL. To do this, you need to install the tablefunc extension. In PostgreSQL 9.1, you simply:
CREATE EXTENSION tablefunc;
In older versions, see this related answer .
Query
The request may look like this:
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 );
I use the crosstab() form with two parameters because it allows to skip attributes. For example, when a person does not have email. This form will then return NULL for the email column. Detailed explanation:
- PostgreSQL crosstab query
Function
Or create a function, so you do not need to specify a list of column definitions for each call:
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;
Call:
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')
Erwin Brandstetter Mar 06 2018-12-12T00: 00Z
source share