PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Generieren Sie dynamisch Spalten in PostgreSQL

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.

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

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