Heim > Datenbank > MySQL-Tutorial > Wie kann ich Daten in MySQL ohne eine native PIVOT-Funktion dynamisch Pivotieren?

Wie kann ich Daten in MySQL ohne eine native PIVOT-Funktion dynamisch Pivotieren?

Patricia Arquette
Freigeben: 2025-01-06 07:24:39
Original
908 Leute haben es durchsucht

How can I dynamically pivot data in MySQL without a native PIVOT function?

Dynamisches PIVOTING in MySQL

In unserer relationalen Datenbank haben wir eine Tabelle mit dem Namen „Teile“, die Informationen über Produktteile, einschließlich deren, enthält Teile-ID, Teiletyp und zugehörige Produkt-ID. Die Tabellenstruktur ähnelt der folgenden:

Parts
--------------------------------------
part_id | part_type | product_id
--------------------------------------
1        | A        | 1
2        | B        | 1
3        | A        | 2
4        | B        | 2
5        | A        | 3
6        | B        | 3
Nach dem Login kopieren

Ziel:

Unser Ziel ist es, eine Abfrage zu erstellen, die diese Daten in ein Pivot-Format umwandelt, was zu einer Tabelle führt mit einer Zeile für jede eindeutige Produkt-ID sowie Spalten, die die entsprechenden Teile-IDs für die Typen „A“ und „B“ darstellen. Die gewünschte Ausgabetabelle sollte so aussehen:

Product_ID | Part_A_ID | Part _B_ID
----------------------------------------
1           | 1         | 2
2           | 3         | 4
3           | 5         | 6
Nach dem Login kopieren

Lösung:

Leider fehlt MySQL eine native PIVOT-Funktion. Wir können sein Verhalten jedoch mithilfe einer Kombination aus Aggregatfunktionen und CASE-Anweisungen simulieren. Um eine dynamische Version zu erstellen, die mehrere Teiletypen verarbeitet, verwenden wir vorbereitete Anweisungen:

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

Diese Abfrage erstellt dynamisch eine SQL-Anweisung basierend auf den eindeutigen Teiltypen in der Tabelle „Teile“. Anschließend verwendet es vorbereitete Anweisungen, um die generierte SQL-Anweisung auszuführen und potenzielle Leistungsprobleme bei großen Ergebnismengen effizient zu behandeln.

Alternative für eine statische Lösung mit einer begrenzten Anzahl von Spalten:

Wenn wir eine begrenzte Anzahl von Teiletypen haben, können wir eine statische Version der Abfrage verwenden:

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

Diese Alternative wird empfohlen, wenn die Anzahl der Teiletypen beträgt fest und klein.

Das obige ist der detaillierte Inhalt vonWie kann ich Daten in MySQL ohne eine native PIVOT-Funktion dynamisch Pivotieren?. 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