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
Freigeben: 2025-01-06 07:56:43
Original
635 Leute haben es durchsucht

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

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

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

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

Beispielausgabe:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
Nach dem Login kopieren
Nach dem Login kopieren

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

Ausgabe:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
Nach dem Login kopieren
Nach dem Login kopieren

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!

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