CASE
und GROUP BY
vs. crosstab
Funktion In PostgreSQL müssen viele Benutzer Zeilendatentabellen zur Analyse und Berichterstellung in Spaltendatentabellen konvertieren. Während CASE
und GROUP BY
häufig verwendete Methoden sind, gibt es dynamischere und effizientere Alternativen.
Betrachten Sie beispielsweise die folgende Tabelle:
id | feh | bar |
---|---|---|
1 | 10 | A |
2 | 20 | A |
3 | 3 | B |
4 | 4 | B |
5 | 5 | C |
6 | 6 | D |
7 | 7 | D |
8 | 8 | D |
Gewünschte Ausgabe Konvertieren Sie diese Daten in das folgende Format:
bar | val1 | val2 | val3 |
---|---|---|---|
A | 10 | 20 | NULL |
B | 3 | 4 | NULL |
C | 5 | NULL | NULL |
D | 6 | 7 | 8 |
CASE
und GROUP BY
Eine Möglichkeit, dies zu erreichen, ist die Verwendung der Techniken CASE
und GROUP BY
:
<code class="language-sql">SELECT bar, MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1", MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2", MAX(CASE WHEN abc."row" = 3 THEN feh ELSE NULL END) AS "val3" FROM ( SELECT bar, feh, row_number() OVER (partition by bar) as row FROM "Foo" ) abc GROUP BY bar </code>
Dieser Ansatz funktioniert zwar, weist jedoch potenzielle Einschränkungen hinsichtlich Flexibilität und Leistung auf.
crosstab
Funktionen: eine dynamische Lösung -Modul in PostgreSQL eingeführte Funktion tablefunc
ist eine dynamischere und effizientere Alternative. Mit der Funktion crosstab()
können Sie die gewünschte Transformation erreichen, ohne die Ausgabespalten explizit zu definieren. crosstab()
crosstab
Lösung wie folgt: crosstab
<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>
Daten in einem Format bereit, das mit SELECT bar, 1 AS cat, feh
kompatibel ist. Die Spalte crosstab()
wird als Dummy-Platzhalter verwendet, da die Tabelle keine Kategorieinformationen enthält. cat
crosstab
<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>
crosstab
-Moduls erreicht werden. tablefunc
bietet eine leistungsstarke und dynamische Alternative zu den Methoden crosstab()
und CASE
. Es ermöglicht eine flexible Datentransformation und ist damit ein wertvolles Werkzeug für die Datenbearbeitung in PostgreSQL. GROUP BY
Das obige ist der detaillierte Inhalt vonWie kann ich in PostgreSQL zeilenorientierte Daten dynamisch in spaltenorientierte Daten umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!