Heim >Datenbank >MySQL-Tutorial >Wie können Daten in MySQL mithilfe von Aggregatfunktionen und CASE-Anweisungen dynamisch geschwenkt werden?

Wie können Daten in MySQL mithilfe von Aggregatfunktionen und CASE-Anweisungen dynamisch geschwenkt werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-06 07:56:43603Durchsuche

How to Dynamically Pivot Data in MySQL Using Aggregate Functions and CASE Statements?

Dynamisches Pivotieren von Daten mit den Aggregatfunktionen und der CASE-Anweisung von MySQL

Betrachten Sie eine Tabelle mit Produktteilen mit dem folgenden Schema:

CREATE TABLE Parts (
    part_id INT NOT NULL,
    part_type CHAR(1) NOT NULL,
    product_id INT NOT NULL,
    PRIMARY KEY (part_id)
);

Probe Daten:

INSERT INTO Parts (part_id, part_type, product_id) VALUES
(1, 'A', 1),
(2, 'B', 1),
(3, 'A', 2),
(4, 'B', 2),
(5, 'A', 3),
(6, 'B', 3);

Ziel ist es, diese Daten in eine Tabelle zu überführen, die die Produktteile als Spalten darstellt:

CREATE TABLE PivotedParts (
    product_id INT NOT NULL,
    part_A_id INT,
    part_B_id INT,
    PRIMARY KEY (product_id)
);

Dynamische Pivotierungslösung:

MySQL verfügt nicht über eine integrierte PIVOT-Funktion, aber eine dynamische Lösung kann mithilfe von Aggregatfunktionen und einem CASE erreicht werden Anweisung:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when part_type = ''',
      part_type,
      ''' then part_id end) AS part_',
      part_type, '_id'
    )
  ) INTO @sql
FROM
  Parts;

SET @sql = CONCAT('SELECT product_id, ', @sql, ' 
                  FROM Parts 
                   GROUP BY product_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Beispielausgabe:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+

Statische Pivotlösung (für eine begrenzte Anzahl von Spalten):

Für eine statische Pivot-Lösung mit einer begrenzten Anzahl von Spalten kann die folgende Abfrage sein verwendet:

SELECT product_id,
  max(case when part_type ='A' then part_id end) as part_A_id,
  max(case when part_type ='B' then part_id end) as part_B_id
FROM Parts
GROUP BY product_id;

Ausgabe:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+

Das obige ist der detaillierte Inhalt vonWie können Daten in MySQL mithilfe von Aggregatfunktionen und CASE-Anweisungen dynamisch geschwenkt werden?. 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