PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Gerar colunas dinamicamente para crosstab no PostgreSQL


Você pode usar a função C fornecida crosstab_hash por esta.

O manual não é muito claro a esse respeito. É mencionado no final do capítulo sobre crosstab() com dois parâmetros:

Você pode criar funções predefinidas para evitar ter que escrever os nomes e tipos de coluna de resultado em cada consulta. Veja os exemplos na seção anterior. A função C subjacente para esta forma de crosstab chama-se crosstab_hash .

Para o seu exemplo:
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;

Ligar:
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');

Observe que você precisa criar um crosstab_hash distinto função para cada crosstab função com um tipo de retorno diferente.

Relacionado:
  • Linha para colunas do PostgreSQL

Sua função para gerar a lista de colunas é bastante complicado, o resultado está incorreto (int ausente após kernel_id ), ele pode ser substituído por esta consulta SQL:
SELECT 'kernel_id int, '
       || string_agg(DISTINCT key::text, ' int, '  ORDER BY key::text)
       || ' int, DUMMY text'
FROM   test_db;

E não pode ser usado dinamicamente de qualquer maneira.