Heim > Datenbank > MySQL-Tutorial > Wie kann ich Zeilen in MySQL basierend auf mehreren Kriterien dynamisch in Spalten umwandeln?

Wie kann ich Zeilen in MySQL basierend auf mehreren Kriterien dynamisch in Spalten umwandeln?

Mary-Kate Olsen
Freigeben: 2025-01-05 12:44:42
Original
979 Leute haben es durchsucht

How to Dynamically Pivot Rows to Columns in MySQL Based on Multiple Criteria?

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.

  1. Unpivot Daten:

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;
Nach dem Login kopieren
  1. Pivot-Daten:

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;
Nach dem Login kopieren
  1. Dynamisches SQL:

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

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!

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