Pivoter les données de manière dynamique avec les fonctions d'agrégation et l'instruction CASE de MySQL
Considérez un tableau de pièces de produit avec le schéma suivant :
CREATE TABLE Parts ( part_id INT NOT NULL, part_type CHAR(1) NOT NULL, product_id INT NOT NULL, PRIMARY KEY (part_id) );
Échantillon Données :
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);
L'objectif est de faire pivoter ces données dans un tableau qui représente les parties du produit sous forme de colonnes :
CREATE TABLE PivotedParts ( product_id INT NOT NULL, part_A_id INT, part_B_id INT, PRIMARY KEY (product_id) );
Solution de pivotement dynamique :
MySQL n'a pas de fonction PIVOT intégrée, mais une solution dynamique peut être obtenue à l'aide de fonctions d'agrégation et d'un CASE déclaration :
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;
Exemple de sortie :
+------------+----------+----------+ | product_id | part_A_id | part_B_id | +------------+----------+----------+ | 1 | 1 | 2 | | 2 | 3 | 4 | | 3 | 5 | 6 | +------------+----------+----------+
Solution de pivotement statique (pour un nombre limité de colonnes) :
Pour une solution de pivotement statique avec un nombre limité de colonnes, la requête suivante peut être utilisé :
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;
Sortie :
+------------+----------+----------+ | product_id | part_A_id | part_B_id | +------------+----------+----------+ | 1 | 1 | 2 | | 2 | 3 | 4 | | 3 | 5 | 6 | +------------+----------+----------+
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!