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
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
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;
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
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!