Dynamische Konvertierung von Zeilen in Spalten basierend auf mehreren Spalten in MySQL
In einer früheren Frage wurde eine MySQL-Abfrage zum dynamischen Konvertieren von Zeilen verwendet zu Spalten für eine einzelne Spalte. Jetzt wollen wir das gleiche Ergebnis für zwei Spalten erzielen: „Daten“ und „Preis“.
Problem:
Konvertieren Sie die Daten in der folgenden Tabelle in Spalten benannt „order1“, „order2“, „order3“, „item1“, „item2“, „item3“ und „item4“, basierend auf „order“ und „item“ Spalten.
id | order | data | item | Price |
---|---|---|---|---|
1 | 1 | P | 1 | 50 |
1 | 1 | P | 2 | 60 |
1 | 1 | P | 3 | 70 |
1 | 2 | Q | 1 | 50 |
1 | 2 | Q | 2 | 60 |
1 | 2 | Q | 3 | 70 |
2 | 1 | P | 1 | 50 |
2 | 1 | P | 2 | 60 |
2 | 1 | P | 4 | 80 |
2 | 3 | S | 1 | 50 |
2 | 3 | S | 2 | 60 |
2 | 3 | S | 4 | 80 |
Gewünschtes Ergebnis:
id | order1 | order2 | order3 | item1 | item2 | item3 | item4 |
---|---|---|---|---|---|---|---|
1 | P | Q | 50 | 60 | 70 | ||
2 | P | S | 50 | 60 | 80 |
Lösung:
Während eine hartcodierte Abfrage dies könnte verwendet werden, wenn die Anzahl der „Order“- und „Item“-Werte bekannt ist, ist im Allgemeinen eine dynamischere Lösung erforderlich Fall.
Entpivotieren der Daten:
MySQL verfügt nicht über eine Unpivot-Funktion, aber eine UNION ALL kann verwendet werden, um die mehreren Datenpaare in Zeilen umzuwandeln:
select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA;
Werte zurück umwandeln in Spalten:
Die nicht gepivotierten Daten können dann mithilfe einer Aggregatfunktion mit CASE:
select id, max(case when col = 'order1' then value end) order1, max(case when col = 'order2' then value end) order2, max(case when col = 'order3' then value end) order3, max(case when col = 'item1' then value end) item1, max(case when col = 'item2' then value end) item2, max(case when col = 'item3' then value end) item3 from ( select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA ) d group by id;
Dynamic Prepared Statement:
wieder in Spalten umgewandelt werdenSchließlich kann die Abfrage mithilfe der satzbasierten Verkettung und in eine dynamische vorbereitete Anweisung umgewandelt werden AUSFÜHREN:
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`) col from tableA union all select concat('item', `item`) col from tableA )d; SET @sql = CONCAT('SELECT id, ', @sql, ' from ( select id, concat(''order'', `order`) col, data value from tableA union all select id, concat(''item'', item) col, price value from tableA ) d group by id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
Dieser Ansatz bietet eine flexible und dynamische Möglichkeit, Zeilen basierend auf mehreren Kriterien in MySQL in Spalten umzuwandeln.
Das obige ist der detaillierte Inhalt vonWie konvertiert man Zeilen in MySQL basierend auf mehreren Spalten dynamisch in Spalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!