Conversion dynamique de lignes en colonnes avec plusieurs critères dans MySQL
Question :
Comment peut-on Je convertis dynamiquement des lignes en colonnes dans MySQL en fonction de deux critères, représentés par deux colonnes ?
Contexte :
Un tableau contient plusieurs lignes avec des colonnes nommées « données » et « prix » pour chaque ligne. L'objectif est de transformer le tableau en un nouveau tableau avec des colonnes représentant des combinaisons uniques de données et de prix, et chaque cellule contenant les données de ligne correspondantes.
Solution :
Pour convertir dynamiquement des lignes en colonnes en fonction de plusieurs critères, nous pouvons utiliser une combinaison de fonctions MySQL et de SQL dynamique.
Tout d'abord, nous annulons le pivotement du tableau d'origine pour créer un nouveau tableau avec plusieurs lignes pour chaque combinaison unique de données et de prix.
SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA;
Ensuite, nous regroupons les données non pivotées en colonnes en utilisant l'instruction CASE.
SELECT id, MAX(CASE WHEN col = 'order1' THEN value END) AS order1, MAX(CASE WHEN col = 'order2' THEN value END) AS order2, MAX(CASE WHEN col = 'order3' THEN value END) AS order3, MAX(CASE WHEN col = 'item1' THEN value END) AS item1, MAX(CASE WHEN col = 'item2' THEN value END) AS item2, MAX(CASE WHEN col = 'item3' THEN value END) AS item3 FROM ( SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA ) d GROUP BY id;
Pour rendre la requête dynamique, nous utilisons des instructions préparées et générons dynamiquement les instructions CASE basé sur les colonnes uniques de la table d'origine.
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN col = ''', col, ''' THEN value END) AS `', col, '`') ) INTO @sql FROM ( SELECT CONCAT('order', `order`) AS col FROM tableA UNION ALL SELECT CONCAT('item', `item`) AS col FROM tableA ) d; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM ( SELECT id, CONCAT(''order'', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT(''item'', item) AS col, price AS value FROM tableA ) d GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
Cette requête dynamique gère un nombre arbitraire de critères uniques et produit le résultat souhaité. table transformée.
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!