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

Genera dinámicamente columnas para tabulaciones cruzadas en PostgreSQL

Puede usar la función C provista crosstab_hash por esto.

El manual no es muy claro al respecto. Se menciona al final del capítulo sobre crosstab() con dos parámetros:

Puede crear funciones predefinidas para evitar tener que escribir los nombres y tipos de columnas de resultados en cada consulta. Vea los ejemplos en la sección anterior. La función C subyacente para esta forma de crosstab se llama crosstab_hash .

Para tu ejemplo:

CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
  RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Llamar:

SELECT * FROM f_cross_test_db(
      'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
     ,'SELECT DISTINCT key FROM test_db ORDER BY 1');

Tenga en cuenta que debe crear un crosstab_hash distinto función para cada crosstab función con un tipo de devolución diferente.

Relacionado:

  • Filas PostgreSQL a columnas

Su función para generar la lista de columnas es bastante complicado, el resultado es incorrecto (int falta después de kernel_id ), se puede reemplazar con esta consulta SQL:

SELECT 'kernel_id int, '
       || string_agg(DISTINCT key::text, ' int, '  ORDER BY key::text)
       || ' int, DUMMY text'
FROM   test_db;

Y no se puede usar dinámicamente de todos modos.