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

Gerar colunas dinamicamente no PostgreSQL


A consulta de referência cruzada básica para o seu exemplo é simples:
SELECT * FROM crosstab(
       'SELECT zoom, day, point
        FROM   province
        ORDER  BY 1, 2'

     , $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);

Mas não com nomes de colunas dinâmicos ou um número dinâmico de colunas. Como compromisso, você pode ter um número fixo de colunas e preencher apenas as primeiras. Fundamentos:
  • Consulta de tabela cruzada PostgreSQL

Dinâmico?


crosstab_hash não irá ajudá-lo com nomes de colunas dinâmicas. É para uso repetido sem digitar uma lista de definição de coluna, mas não para dinâmico nomes de colunas. Exemplos:
  • Gerar colunas dinamicamente para crosstab no PostgreSQL
  • Sql:transpondo linhas em colunas

Para nomes de colunas realmente dinâmicos, você precisa de dois ida e volta ao servidor. Quer você recupere os nomes das colunas com uma primeira consulta para criar uma segunda consulta ou crie um cursor ou uma tabela temporária ou uma instrução preparada. O que quer que você tente, você precisa de duas viagens de ida e volta. SQL quer saber o tipo de retorno no momento da chamada.

O mais próximo que consegui de uma chamada "dinâmica" é com meu crosstab_n() personalizado função definida nesta resposta relacionada:
  • Alternativa dinâmica para dinamizar com CASE e GROUP BY

Ou você desiste da ideia de uma consulta cruzada completamente dinâmica (porque, você sabe, é impossível) e usa um fluxo de trabalho de duas etapas, como mencionado acima.

  1. Deixe uma função gerar o texto da consulta de tabela cruzada. Você pode usar a função fornecida aqui (e adaptá-la às suas necessidades!):
    • Executar uma consulta de tabela cruzada dinâmica

    Em particular, remova GROUP BY 1, 2 , já que você não agrega linhas antes da tabulação cruzada.

  2. Execute a função gerada.

Para completar, há também o novo \crosstabview metacomando no psql no Postgres 9.6 (recém lançado) - com funcionalidade semelhante, e pode exibir nomes de colunas dinâmicos (a anexação de nomes dinâmicos acontece no cliente psql, não no servidor Postgres).