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

Zeitleistenimplementierungsmethode basierend auf ccs3

In Webprojekten nutzen wir häufig die Zeitleisten...

Analyse des Uniapp-Einsteiger-NVUE-Klettergrubenrekords

Inhaltsverzeichnis Vorwort Hallo Welt Bild Rahmen...

Eine kurze Einführung in React

Inhaltsverzeichnis 1. CDN-Einführung 1.1 reagiere...

So entwickeln Sie Uniapp mit vscode

Da ich immer vscode zur Entwicklung von Front-End...

Was tun, wenn Sie Ihr MySQL-Passwort vergessen?

Zweimal Ihr MySQL-Passwort vergessen? Zuerst habe...

DOCTYPE-Element ausführliche Erklärung vollständige Version

1. Übersicht In diesem Artikel wird das DOCTYPE-E...

Tutorial zur Installation von JDK und Tomcat unter Linux CentOS

Laden Sie zuerst JDK herunter. Hier verwenden wir...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.11 (Win10)

In diesem Artikel werden die Installations- und K...

Wann ist die Verwendung von dl, dt und dd sinnvoll?

dl: Definitionsliste Definitionsliste dt: Definiti...

Lösen Sie das Problem beim Laden der Vektorkartenquelle in OpenLayers 3

1. Vektorkarte Vektorgrafiken verwenden gerade Li...

So vergleichen Sie zwei Datenbanktabellenstrukturen in MySQL

Während des Entwicklungs- und Debugging-Prozesses...