sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL fila a columnas

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')