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