PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Genera dinamicamente colonne in PostgreSQL

La query di base a campi incrociati per il tuo esempio è semplice:

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

Ma non con nomi di colonne dinamici o un numero dinamico di colonne. Come compromesso, puoi avere un numero fisso di colonne e riempire solo quelle iniziali. Nozioni di base:

  • Query a campi incrociati PostgreSQL

Dinamico?

crosstab_hash non ti aiuterà con i nomi dinamici delle colonne. È per un uso ripetuto senza digitare un elenco di definizioni di colonna, ma non per dinamico nomi di colonna. Esempi:

  • Genera dinamicamente colonne per campi incrociati in PostgreSQL
  • Sql:trasposizione di righe in colonne

Per nomi di colonna veramente dinamici, sono necessari due viaggi di andata e ritorno al server. Sia che tu recuperi i nomi delle colonne con una prima query per creare una seconda query, sia che tu crei un cursore o una tabella temporanea o un'istruzione preparata. Qualunque cosa tu provi, hai bisogno di due viaggi di andata e ritorno. SQL vuole conoscere il tipo restituito al momento della chiamata.

Il più vicino possibile a una chiamata "dinamica" è con il mio crosstab_n() personalizzato funzione definita in questa risposta correlata:

  • Alternativa dinamica al pivot con CASE e GROUP BY

Oppure rinunci all'idea di una query a campi incrociati completamente dinamica (perché, sai, è impossibile) e utilizzi un flusso di lavoro in due passaggi, come menzionato sopra.

  1. Lascia che una funzione generi il testo della query a campi incrociati. Puoi utilizzare la funzione fornita qui (e adattarla alle tue esigenze!):

    • Esegui una query a campi incrociati dinamica

    In particolare, rimuovi GROUP BY 1, 2 , poiché non aggreghi le righe prima della tabulazione incrociata.

  2. Esegui la funzione generata.

Per completezza c'è anche il nuovo \crosstabview metacomando in psql in Postgres 9.6 (appena rilasciato) - con funzionalità simili e può visualizzare nomi di colonne dinamici (l'associazione di nomi dinamici avviene nel client psql, non nel server Postgres).