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
Freigeben: 2024-12-29 14:22:11
Original
768 Leute haben es durchsucht

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage