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.