MySQL Pivot: Spalten in Zeilen konvertieren
In relationalen Datenbanken wie MySQL müssen Daten häufig zu Berichtszwecken transformiert werden. Eine solche Transformation umfasst die Umwandlung von Spalten in Zeilen, ein Vorgang, der als „Pivotieren“ bezeichnet wird. Diese Technik ermöglicht eine flexiblere und prägnantere Datendarstellung.
Frage:
Betrachten Sie die folgende MySQL-Tabelle:
<code class="language-sql">CREATE TABLE mytable ( id INT, month VARCHAR(3), col1 VARCHAR(1), col2 VARCHAR(1), col3 VARCHAR(1), col4 VARCHAR(1) ); INSERT INTO mytable (id, month, col1, col2, col3, col4) VALUES (101, 'Jan', 'A', 'B', NULL, 'B'), (102, 'Feb', 'C', 'A', 'G', 'E');</code>
Ziel ist es, einen Bericht zu erstellen, der die Werte von Spalte 1 bis Spalte 4 als Zeilen und die Monate Jan und Februar als Spalten anzeigt.
Lösung:
MySQL bietet keine integrierten Funktionen zum Aufheben oder Pivotieren von Daten. Wir können diese Vorgänge jedoch mit UNION ALL simulieren und mit CASE-Ausdrücken aggregieren.
1. Anti-Perspektive:
Um die Pivotierung der Daten aufzuheben, erstellen wir eine neue Unterabfrage, die UNION ALL verwendet, um Zeilen aus allen Spalten in einer einzigen Spalte zu kombinieren:
<code class="language-sql">SELECT id, month, col1 AS `value`, 'col1' AS `descrip` UNION ALL SELECT id, month, col2 AS `value`, 'col2' AS `descrip` UNION ALL SELECT id, month, col3 AS `value`, 'col3' AS `descrip` UNION ALL SELECT id, month, col4 AS `value`, 'col4' AS `descrip` FROM mytable;</code>
2. Perspektive:
Als nächstes packen wir die Unpivot-Abfrage in eine Unterabfrage und verwenden Aggregate und CASE-Anweisungen, um die Daten in das erforderliche Format umzuwandeln:
<code class="language-sql">SELECT descrip, MAX(CASE WHEN month = 'Jan' THEN `value` ELSE NULL END) AS Jan, MAX(CASE WHEN month = 'Feb' THEN `value` ELSE NULL END) AS Feb FROM ( SELECT id, month, `value`, descrip FROM ( SELECT id, month, col1 AS `value`, 'col1' AS `descrip` UNION ALL SELECT id, month, col2 AS `value`, 'col2' AS `descrip` UNION ALL SELECT id, month, col3 AS `value`, 'col3' AS `descrip` UNION ALL SELECT id, month, col4 AS `value`, 'col4' AS `descrip` FROM mytable ) AS unpivoted ) AS src GROUP BY descrip;</code>
Ergebnis:
Descrip | Jan | Feb |
---|---|---|
col1 | A | C |
col2 | B | A |
col3 | NULL | G |
col4 | B | E |
Hinweis: Ändern Sie ELSE 0 END
in ELSE NULL END
, um das Ergebnis konsistenter mit den Datenbankspezifikationen zu machen und unnötige 0-Werte zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie kann ich in MySQL für die Berichterstellung Spalten in Zeilen umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!