Eine effizientere Möglichkeit, dynamische Pivot-Tabellen mithilfe von CASE- und GROUP BY-Anweisungen zu implementieren
Im Vergleich zu der im Artikel bereitgestellten Abfrage ist die Verwendung der Funktion tablefunc
in der Erweiterung crosstab()
eine effizientere Alternative.
Installation:
Installieren Sie zunächst die tablefunc
-Erweiterung, falls Sie dies noch nicht getan haben:
<code class="language-sql">CREATE EXTENSION tablefunc;</code>
Grundlegende Kreuztabellenlösung:
Einfache crosstab
Lösung für dieses Szenario:
<code class="language-sql">SELECT * FROM crosstab( 'SELECT bar, 1 AS cat, feh FROM tbl_org ORDER BY bar, feh') AS ct (bar text, val1 int, val2 int, val3 int);</code>
Synthetische Kategoriespalte:
Wenn Sie keine tatsächliche Kategoriespalte haben, können Sie Fensterfunktionen verwenden, um eine synthetische Kategoriespalte zu erstellen:
<code class="language-sql">SELECT * FROM crosstab( $$ SELECT bar, val, feh FROM ( SELECT *, 'val' || row_number() OVER (PARTITION BY bar ORDER BY feh) AS val FROM tbl_org ) x ORDER BY 1, 2 $$ , $$VALUES ('val1'), ('val2'), ('val3')$$ ) AS ct (bar text, val1 int, val2 int, val3 int);</code>
Dynamische Kreuztabelle?
Das Erstellen eines vollständig dynamischen crosstab
mit plpgsql ist aufgrund der Einschränkungen dynamischer Rückgabetypen eine Herausforderung. Hier ist ein einfacheres Testfallbeispiel:
<code class="language-sql">SELECT * FROM crosstab('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2') AS ct (row_name text, val1 int, val2 int, val3 int);</code>
Tablefunc-Modul:
Das Modultablefunc
bietet einen vereinfachten Ansatz:
<code class="language-sql">SELECT * FROM crosstab1('SELECT row_name, attrib, val::text FROM tbl ORDER BY 1,2');</code>
Das obige ist der detaillierte Inhalt vonWie kann ich mit „crossstab()' effizient dynamische Pivot-Tabellen in PostgreSQL erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!