Dynamisches Konvertieren von Zeilen in Spalten mit mehreren Kriterien in MySQL
Frage:
Wie kann Ich konvertiere Zeilen in MySQL dynamisch in Spalten basierend auf zwei Kriterien, dargestellt durch zwei Spalten?
Kontext:
Eine Tabelle enthält mehrere Zeilen mit den Spalten „Daten“ und „Preis“ für jede Zeile. Das Ziel besteht darin, die Tabelle in eine neue Tabelle umzuwandeln, deren Spalten eindeutige Kombinationen von Daten und Preis darstellen und in der jede Zelle die entsprechenden Zeilendaten enthält.
Lösung:
Um Zeilen basierend auf mehreren Kriterien dynamisch in Spalten umzuwandeln, können wir eine Kombination aus MySQL-Funktionen und dynamischem SQL verwenden.
Zuerst entpivotieren wir die ursprüngliche Tabelle, um eine neue Tabelle mit mehreren Zeilen für jede eindeutige Kombination aus Daten und Preis zu erstellen.
SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA;
Als nächstes aggregieren wir die nicht pivotierten Daten wieder in Spalten unter Verwendung der CASE-Anweisung.
SELECT id, MAX(CASE WHEN col = 'order1' THEN value END) AS order1, MAX(CASE WHEN col = 'order2' THEN value END) AS order2, MAX(CASE WHEN col = 'order3' THEN value END) AS order3, MAX(CASE WHEN col = 'item1' THEN value END) AS item1, MAX(CASE WHEN col = 'item2' THEN value END) AS item2, MAX(CASE WHEN col = 'item3' THEN value END) AS item3 FROM ( SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA ) d GROUP BY id;
Um die Abfrage dynamisch zu gestalten, verwenden wir vorbereitete Anweisungen und generieren dynamisch den CASE Anweisungen basierend auf den eindeutigen Spalten in der Originaltabelle.
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN col = ''', col, ''' THEN value END) AS `', col, '`') ) INTO @sql FROM ( SELECT CONCAT('order', `order`) AS col FROM tableA UNION ALL SELECT CONCAT('item', `item`) AS col FROM tableA ) d; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM ( SELECT id, CONCAT(''order'', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT(''item'', item) AS col, price AS value FROM tableA ) d GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
Diese dynamische Abfrage verarbeitet eine beliebige Anzahl eindeutiger Kriterien und erzeugt die gewünschte transformierte Tabelle.
Das obige ist der detaillierte Inhalt vonWie kann ich Zeilen in MySQL basierend auf mehreren Kriterien dynamisch in Spalten umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!