Heim > Datenbank > MySQL-Tutorial > Wie kann ich in PostgreSQL zeilenorientierte Daten dynamisch in spaltenorientierte Daten umwandeln?

Wie kann ich in PostgreSQL zeilenorientierte Daten dynamisch in spaltenorientierte Daten umwandeln?

Patricia Arquette
Freigeben: 2025-01-20 22:38:13
Original
765 Leute haben es durchsucht

How Can I Dynamically Transform Row-Oriented Data into Column-Oriented Data in PostgreSQL?

Alternativen zum dynamischen Konvertieren von Zeilendaten in Spaltendaten in PostgreSQL: 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.

Problembeschreibung

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

Lösung mit 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>
Nach dem Login kopieren

Dieser Ansatz funktioniert zwar, weist jedoch potenzielle Einschränkungen hinsichtlich Flexibilität und Leistung auf.

crosstabFunktionen: eine dynamische Lösung

Die vom

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

Grundlegende

Lösungcrosstab

Für das Beispielproblem lautet die grundlegende

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>
Nach dem Login kopieren
In dieser Abfrage stellt

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

Erweiterte

Lösungencrosstab

Wenn eine tatsächliche Kategoriespalte vorhanden ist, können Sie diese verwenden, um die Reihenfolge der Werte in den Ergebnissen zu steuern. Die folgende Abfrage zeigt dies:

<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>
Nach dem Login kopieren
Neuigkeiten

crosstab

Während die obige Lösung eine dynamische Spaltengenerierung bietet, ist die dynamische Rückgabe verschiedener Spalten in PostgreSQL eine größere Herausforderung. Unter bestimmten Einschränkungen kann dies jedoch mithilfe der integrierten Funktionalität des

-Moduls erreicht werden. tablefunc

Fazit

Die Funktion

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage