Heim >Datenbank >MySQL-Tutorial >Wie konvertiert man Zeilen in MySQL basierend auf mehreren Spalten dynamisch in Spalten?

Wie konvertiert man Zeilen in MySQL basierend auf mehreren Spalten dynamisch in Spalten?

Susan Sarandon
Susan SarandonOriginal
2024-12-29 14:22:11770Durchsuche

How to Dynamically Convert Rows to Columns in MySQL Based on Multiple Columns?

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 werden

Schließ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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn