So konvertieren Sie Zeilen in Spalten in MySQL

So konvertieren Sie Zeilen in Spalten in MySQL

MySQL-Zeilen-zu-Spalten-Operation

Die sogenannte Zeilen-zu-Spalten-Operation dient dazu, die Zeileninformationen einer Tabelle in Spalteninformationen umzuwandeln. Sie ist vielleicht etwas allgemein gehalten. Hier ist ein Beispiel:

+----+----------+--------+-------+
| ID | BENUTZERNAME | KURS | ERGEBNIS |
+----+----------+--------+-------+
| | Zhang San| Mathematik| |
| | Zhang San| Chinesisch| |
| | Zhang San| Englisch| |
| | Li Si| Mathematik| |
| | Li Si| Chinesisch| |
| | Li Si| Englisch| |
| | Wang Wu| Mathematik| |
| | Wang Wu| Chinesisch| |
| | Wang Wu| Englisch| |
+----+----------+--------+-------+
 Zeilen im Set (0,00 Sek.)

+-------------+--------+--------+--------+
| Benutzername | Mathematik| Chinesisch| Englisch|
+-------------+--------+--------+--------+
| Zhang San| | | |
| Li Si| | | |
| Wang Wu| | | |
+-------------+--------+--------+--------+
 Zeilen im Set (0,00 Sek.)

Im obigen Beispiel enthält Tabelle 1 die drei Noten von drei Schülern, während Tabelle 2 die Zeilendatensatzinformationen (Fach, Name) von Tabelle 1 in Spalteninformationen umwandelt und diese in Gruppen entsprechend der unterschiedlichen Benutzernamen anzeigt.

1 Fall, wenn Betriebsmethode

Um die obige Funktion zu erreichen, müssen wir eine Analyse durchführen. Zuerst müssen wir drei Spalten generieren, nämlich Mathematik, Chinesisch und Englisch, und dann die entsprechenden Daten für die Werte in jeder Spalte eintragen. Hier müssen wir den MySQL-Fall verwenden, wenn die Operation dann endet, was eine bedingte Operation ist. Zu dieser bedingten Anweisung geben wir zunächst eine Erklärung:

Fall-Spalte 
  wenn Bedingung1 dann Ergebnis1
  wenn Bedingung2 dann Ergebnis2
  wenn Bedingung3 dann Ergebnis3
sonst Ergebnis4
Ende

Die obige Syntax kann so verstanden werden: Wenn der Wert der Spalte Bedingung1 erfüllt, verwenden Sie „result1“, um den Wert der Spalte zu ersetzen, usw. Wenn der Spaltenwert die Bedingung nicht erfüllt, verwenden Sie „result4“, um den Wert der Spalte zu ersetzen.

Nun starten wir das Experiment:

Zuerst erstellen wir eine Tabelle und tragen folgende Daten ein:

mysql-yeyz ::>>Wählen Sie * aus test_tbl;
+----+----------+--------+-------+
| ID | BENUTZERNAME | KURS | ERGEBNIS |
+----+----------+--------+-------+
| | Zhang San| Mathematik| |
| | Zhang San| Chinesisch| |
| | Zhang San| Englisch| |
| | Li Si| Mathematik| |
| | Li Si| Chinesisch| |
| | Li Si| Englisch| |
| | Wang Wu| Mathematik| |
| | Wang Wu| Chinesisch| |
| | Wang Wu| Englisch| |
+----+----------+--------+-------+
 Zeilen im Set (0,00 Sek.)

Gemäß der obigen Syntax definieren wir, wenn der Kurs „Mathematik“ ist, eine Spalte „Mathematik“ und füllen sie mit der Punktzahl. Wenn wir auf „Chinesisch“ oder „Englisch“ stoßen, ersetzen wir es durch 0. Wir können zunächst das folgende allgemeine SQL schreiben:

mysql-yeyz ::>>SELECT Benutzername ,
(FALL Kurs, WENN 'Kurs', DANN Punktzahl, SONST ENDE) Kurs VON test_tbl;
+-------------+--------+
| Benutzername | Mathematik |
+-------------+--------+
| Zhang San| |
| Zhang San| |
| Zhang San| |
| Li Si| |
| Li Si| |
| Li Si| |
| Wang Wu| |
| Wang Wu| |
| Wang Wu| |
+-------------+--------+
 Zeilen im Set (0,00 Sek.)

Wir stellen fest, dass die obige Tabelle nur zwei Spalten hat. Gemäß den SQL-Regeln können wir die Werte „Chinesisch“ und „Englisch“ hinzufügen und mehrere weitere Spalten gleichzeitig schreiben, wie folgt:

mysql-yeyz ::>>SELECT Benutzername ,
  -> (CASE Kurs WENN 'Mathematik' DANN Punktzahl SONST ENDE ) Mathematik,
  -> (CASE Kurs WENN 'Chinesisch' DANN Punktzahl SONST ENDE ) Chinesisch,
  -> (CASE Kurs, wenn „Englisch“, dann Punktzahl, sonst Ende) Englisch -> von Test_tbl;
+-------------+--------+--------+--------+
| Benutzername | Mathematik| Chinesisch| Englisch|
+-------------+--------+--------+--------+
| Zhang San| | | |
| Zhang San| | | |
| Zhang San| | | |
| Li Si| | | |
| Li Si| | | |
| Li Si| | | |
| Wang Wu| | | |
| Wang Wu| | | |
| Wang Wu| | | |
+-------------+--------+--------+--------+
 Zeilen im Set (0,00 Sek.)

Jetzt haben wir alle Datensätze und sind fast am Ziel. Sehen wir uns den Unterschied zum Endergebnis an:

+-------------+--------+--------+--------+
| Benutzername | Mathematik| Chinesisch| Englisch|
+-------------+--------+--------+--------+
| Zhang San| | | |
| Li Si| | | |
| Wang Wu| | | |
+-------------+--------+--------+--------+

Es scheint, dass nur noch die Informationen der Studenten mit demselben Namen zusammengeführt werden müssen. Natürlich denken wir an die Operation group_by (Benutzername), und die Operation group_by muss mit einigen Aggregatfunktionen (MAX, MIN, AVG, SUM, COUNT usw.) kombiniert werden. Da jeder Datensatz nur die Punktzahl des aktuellen Subjekts enthält und die Punktzahlen der anderen Subjekte 0 sind, sind die Ergebnisse bei Verwendung der MAX-Funktion und der SUM-Funktion dieselben, aber die AVG-Funktion und die MIN-Funktion können nicht verwendet werden. Dies sollte leicht zu verstehen sein.

Nachfolgend geben wir das Endergebnis an:

mysql-yeyz 13:55:52>>SELECT Benutzername,
  -> MAX(CASE Kurs WENN 'Kurs' DANN Punktzahl SONST ENDE ) Mathematik,
  -> MAX(CASE Kurs WENN 'Chinesisch' DANN Punktzahl SONST ENDE ) Chinesisch,
  -> MAX(CASE Kurs WENN 'Englisch' DANN Punktzahl SONST ENDE ) Englisch-> FROM test_tbl
  -> GRUPPE NACH BENUTZERNAME;
+-------------+--------+--------+--------+
| Benutzername | Mathematik| Chinesisch| Englisch|
+-------------+--------+--------+--------+
| Zhang San | 34 | 58 | 58 |
| 45 | 87 | 45 |
| Wang Wu| 76 | 34 | 89 |
+-------------+--------+--------+--------+
3 Zeilen im Satz (0,00 Sek.)



mysql-yeyz ::>>SELECT Benutzername ,
  -> Summe (Fall Kurs, wenn 'Kurs', dann Punktzahl, sonst Ende) Mathematik,
  -> Summe (Fall Kurs, wenn 'Chinesisch', dann Punktzahl, sonst Ende) Chinesisch,
  -> Summe (Fall Kurs, wenn 'Englisch', dann Punktzahl, sonst Ende) Englisch -> von Testtabelle
  -> GRUPPE NACH BENUTZERNAME;
+-------------+--------+--------+--------+
| Benutzername | Mathematik| Chinesisch| Englisch|
+-------------+--------+--------+--------+
| Zhang San | 34 | 58 | 58 |
| 45 | 87 | 45 |
| Wang Wu| 76 | 34 | 89 |
+-------------+--------+--------+--------+
3 Zeilen im Satz (0,00 Sek.)


mysql-yeyz ::>>SELECT Benutzername ,
  -> MIN(CASE Kurs WENN 'Mathematik' DANN Punktzahl SONST ENDE ) Mathematik,
  -> MIN(CASE Kurs WENN 'Chinesisch' DANN Punktzahl SONST ENDE ) Chinesisch,
  -> MIN(CASE Kurs WENN 'Englisch' DANN Punktzahl SONST ENDE ) Englisch-> FROM test_tbl
  -> GRUPPE NACH BENUTZERNAME;
+-------------+--------+--------+--------+
| Benutzername | Mathematik| Chinesisch| Englisch|
+-------------+--------+--------+--------+
| 0 | 0 | 0 |
| Li Si| 0 | 0 | 0 |
| Wang Wu| 0 | 0 | 0 |
+-------------+--------+--------+--------+
3 Zeilen im Satz (0,00 Sek.)

Es ist ersichtlich, dass die Ergebnisse bei Verwendung von MAX und SUM dieselben sind, die Verwendung von MIN als Aggregatfunktion jedoch dazu führt, dass das endgültige Ausgabeergebnis 0 ist, da jedes Mal der Mindestwert des durch den Benutzernamen angegebenen Betreffs ausgewählt wird, der 0 ist. Dieses Ergebnis ist leicht zu verstehen.

2 wenn Betriebsmethode

Wenn man die obige Fall-When-Operationsmethode versteht, ist auch die If-Operationsmethode leicht zu verstehen. Das Prinzip ist dasselbe, außer dass die Syntax von Fall-When in die If-Methode umgewandelt wird, wie folgt

mysql-yeyz 14:12:42>>SELECT Benutzername,
  -> MAX(wenn (Kurs= 'Mathematik',Punktzahl,) ) Mathematik,
  -> MAX(wenn (Kurs= 'Chinesisch',Punktzahl,) ) Chinesisch,
  -> MAX(wenn (Kurs= 'Englisch',Punktzahl,) ) Englisch-> FROM test_tbl
  -> GRUPPE NACH BENUTZERNAME;
+-------------+--------+--------+--------+
| Benutzername | Mathematik| Chinesisch| Englisch|
+-------------+--------+--------+--------+
| Zhang San | 34 | 58 | 58 |
| 45 | 87 | 45 |
| Wang Wu| 76 | 34 | 89 |
+-------------+--------+--------+--------+
3 Zeilen im Satz (0,00 Sek.)

3 Fügen Sie eine Gesamtspalte hinzu

Nachdem wir die grundlegende Zeilen-zu-Spalten-Konvertierung durchgeführt haben, müssen wir der konvertierten Tabelle nun ein Gesamtfeld hinzufügen. Wir können dieses Feld folgendermaßen hinzufügen, d. h. wenn wir mit dem Zählen beginnen, zählen wir auch den Score-Wert, und zwar wie folgt:

mysql-yeyz 14:18:06>>SELECT Benutzername,
  -> (CASE Kurs WENN 'Mathematik' DANN Punktzahl SONST ENDE ) Mathematik,
  -> (CASE Kurs WENN 'Chinesisch' DANN Punktzahl SONST ENDE ) Chinesisch,
  -> (CASE Kurs WENN 'Englisch' DANN Punktzahl SONST ENDE ) Englisch,
  -> (Punktzahl) gesamt
  -> VON test_tbl;
+-----------+--------+--------+--------+-----------+
| Benutzername | Mathematik| Chinesisch| Englisch| gesamt |
+-----------+--------+--------+--------+-----------+
| Zhang San | 34 | 0 | 0 | 34 |
| Zhang San | 0 | 58 | 0 | 58 |
| Zhang San | 0 | 0 | 58 | 58 |
| 0 | 0 | 45 |
| 0 | 87 | 0 | 87 |
| 0 | 0 | 45 | 45 |
| Wang Wu | 76 | 0 | 0 | 76 |
| Wang Wu| 0 | 34 | 0 | 34 |
| Wang Wu| 0 | 0 | 89 | 89 |
+-----------+--------+--------+--------+-----------+
9 Zeilen im Satz (0,00 Sek.)

Die obigen Ergebnisse sind nicht aggregiert. Es ist zu beachten, dass, wenn wir aggregieren möchten, die ersten drei Spalten die Summen- oder Max-Methode verwenden können und die letzte Spalte die Summenmethode verwenden muss, da wir die Gesamtpunktzahl benötigen und die Verwendung der Max-Methode dazu führt, dass der Wert der Wert mit der höchsten Punktzahl wird. Das endgültige SQL lautet wie folgt:

mysql-yeyz 14:18:29>>SELECT Benutzername,
  -> Summe (Fall Kurs, wenn 'Kurs', dann Punktzahl, sonst Ende) Mathematik,
  -> Summe (Fall Kurs, wenn 'Chinesisch', dann Punktzahl, sonst Ende) Chinesisch,
  -> Summe (Fall Kurs, wenn 'Englisch', dann Punktzahl, sonst Ende) Englisch,
  -> Summe(Punktzahl) Gesamt
  -> VON test_tbl
  -> GRUPPE NACH BENUTZERNAME;
+-----------+--------+--------+--------+-----------+
| Benutzername | Mathematik| Chinesisch| Englisch| gesamt |
+-----------+--------+--------+--------+-----------+
| Zhang San | 34 | 58 | 58 | 150 |
| 45 | 87 | 45 | 177 |
| Wang Wu | 76 | 34 | 89 | 199 |
+-----------+--------+--------+--------+-----------+
3 Zeilen im Satz (0,00 Sek.)

4 Einfache Methode group_concat

Wenn wir es mit dem Anzeigeformat der Ergebnisse nicht so genau nehmen, können wir auch eine grobe Methode verwenden, nämlich die Funktion group_concat, um alle Spalten zusammenzuschreiben und sie in einem Feld darzustellen. Der Effekt ist wie folgt:

mysql-yeyz 14:19:13>>SELECT Benutzername,
GROUP_CONCAT(`Kurs`,":",Punktzahl)AS Punktzahl FROM test_tbl 
GROUP BY Benutzername;
+--------------+------------------+
| Benutzername | Noten |
+--------------+------------------+
| Zhang San | Mathematik: 34, Chinesisch: 58, Englisch: 58 |
| Li Si | Mathematik: 45, Chinesisch: 87, Englisch: 45 |
| Wang Wu | Mathematik: 76, Chinesisch: 34, Englisch: 89 |
+--------------+------------------+
3 Zeilen im Satz (0,00 Sek.)

Diese Methode entspricht der direkten Gruppierung der Originaltabelle und kann auch mit bestimmten Anwendungsszenarien umgehen.

Oben finden Sie den detaillierten Inhalt der Methode zum Konvertieren von Zeilen in Spalten in MySQL. Weitere Informationen zur Konvertierung von MySQL-Zeilen in Spalten finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • MySQL-Zeilen-zu-Spalten-Details
  • So konvertieren Sie eine Spalte mit durch Kommas getrennten Werten in Spalten in MySQL
  • Detaillierte Beispiele zur Konvertierung von Zeilen in Spalten und Spalten in Zeilen in MySQL
  • Verwenden der dynamischen Konvertierung von Zeilen in Spalten in einer gespeicherten MySQL-Prozedur
  • MySQL Zeile zu Spalte und Spalte zu Zeile

<<:  Detaillierte Erläuterung der Docker-Container-Lebenszyklusarchitektur und der Unterschiede zwischen dieser und VM

>>:  Warum gibt es das in JS?

Artikel empfehlen

Detaillierte Untersuchung von vue2.x - Erklärung der h-Funktion

Inhaltsverzeichnis Lösung, Zusammenfassen: Vue-Pr...

So legen Sie die Speichergröße von Docker Tomcat fest

Wenn Sie Tomcat in Docker installieren, kann es b...

Einführung in das Batch-Cache-Löschskript von nginx proxy_cache

Vorwort: Ich habe zuvor den offiziellen Proxy-Cac...

Implementierungsschritte zum Installieren einer Java-Umgebung in Docker

Dieser Artikel basiert auf Linux CentOS8, um Dock...

Implementierung zum Hinzufügen von Bemerkungsinformationen zu MySQL

Vorwort Einige Leute haben mich in diesen Tagen u...

Grundlegendes Tutorial zur Verwendung der Explain-Anweisung in MySQL

Inhaltsverzeichnis 1. Übersicht 1. Aussagetest er...

So stellen Sie Docker-Containerdaten wieder her

Die Datenbankdaten der Projekttestumgebung sind v...

Einige Erfahrungen zum Aktivieren von HTTPS

Da sich die heimische Netzwerkumgebung immer weit...

Erläuterung der HTTPS-Prinzipien

Da die Kosten für die Erstellung von HTTPS-Websit...

MySql Installer 8.0.18 Visuelles Installationstutorial mit Bildern und Text

Inhaltsverzeichnis 1. MySQL 8.0.18 installieren 2...

So bereinigen Sie regelmäßig Bilder, die über Jenkins „None“ sind

Vorwort Wenn beim kontinuierlichen Code-Delivery-...

Implementierung einer benutzerdefinierten Vue-Vorlage von vscode

Verwenden Sie den Vscode-Editor, um eine Vue-Vorl...