Die grundlegende Kreuztabellenabfrage für Ihr Beispiel ist einfach:
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);
Aber nicht B. mit dynamischen Spaltennamen oder einer dynamischen Spaltenanzahl. Als Kompromiss können Sie eine feste Spaltenanzahl haben und nur die führenden füllen. Grundlagen:
- PostgreSQL-Kreuztabellenabfrage
Dynamisch?
crosstab_hash
wird Ihnen bei dynamischen Spaltennamen nicht helfen. Es ist für die wiederholte Verwendung ohne Eingabe einer Spaltendefinitionsliste, aber nicht für dynamisch Spaltennamen. Beispiele:
- Spalten für Kreuztabellen in PostgreSQL dynamisch generieren
- Sql:Transponieren von Zeilen in Spalten
Für wirklich dynamische Spaltennamen benötigen Sie zwei Roundtrips zum Server. Unabhängig davon, ob Sie die Spaltennamen mit einer ersten Abfrage abrufen, um eine zweite Abfrage zu erstellen, oder ob Sie einen Cursor oder eine temporäre Tabelle oder eine vorbereitete Anweisung erstellen. Was auch immer Sie versuchen, Sie brauchen zwei Hin- und Rückfahrten. SQL möchte den Rückgabetyp zum Zeitpunkt des Aufrufs wissen.
Am nächsten komme ich einem "dynamischen" Aufruf mit meinem benutzerdefinierten crosstab_n()
Funktion, die in dieser verwandten Antwort definiert ist:
- Dynamische Alternative zu Pivot mit CASE und GROUP BY
Oder Sie geben die Idee einer vollständig dynamischen Kreuztabellenabfrage auf (weil das unmöglich ist) und verwenden einen zweistufigen Workflow, wie oben erwähnt.
-
Lassen Sie eine Funktion den Text der Kreuztabellenabfrage generieren. Sie können die hier bereitgestellte Funktion verwenden (und an Ihre Bedürfnisse anpassen!):
- Führen Sie eine dynamische Kreuztabellenabfrage aus
Entfernen Sie insbesondere
GROUP BY 1, 2
, da Sie vor der Kreuztabelle keine Zeilen aggregieren. -
Führen Sie die generierte Funktion aus.
Der Vollständigkeit halber gibt es auch die neue \crosstabview
Metabefehl in psql in Postgres 9.6 (gerade veröffentlicht) - mit ähnlicher Funktionalität, und es kann dynamische Spaltennamen anzeigen (das Anhängen dynamischer Namen geschieht im psql-Client, nicht im Postgres-Server).