Les tableaux croisés dynamiques facilitent l'analyse de gros volumes de données en organisant les informations dans un ensemble de données plus petit et gérable. Cependant, il n'y a pas de fonction intégrée pour réaliser le pivot dans MySQL. Nous devons écrire une requête SQL pour convertir une ligne en colonne dans MySQL, puis créer un rapport pivot dans MySQL. Voyons donc comment créer des tableaux croisés dynamiques dans MySQL.
Comment créer des tableaux croisés dynamiques dans MySQL
Si vous souhaitez créer un tableau croisé dynamique dans MySQL, vous utiliserez généralement des instructions IF/CASE. Cependant, cette approche ne fonctionne que lorsque vous connaissez déjà toutes les colonnes que vous devez créer dans un tableau croisé dynamique.
Comment créez-vous des tableaux croisés dynamiques dans MySQL, lorsque vous ne connaissez pas les colonnes à créer ou si vous vous attendez à ce qu'elles changent avec le temps ? Dans de tels cas, nous utilisons le GROUP_CONCAT fonction.
Disons que vous avez le tableau suivant
CREATE TABLE Meeting ( ID INT, Meeting_id INT, field_key VARCHAR(100), field_value VARCHAR(100) ); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (1, 1,'first_name' , 'Alec'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (2, 1,'last_name' , 'Jones'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (3, 1,'occupation' , 'engineer'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (4,2,'first_name' , 'John'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (5,2,'last_name' , 'Doe'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (6,2,'occupation' , 'engineer'); +------+------------+------------+-------------+ | ID | Meeting_id | field_key | field_value | +------+------------+------------+-------------+ | 1 | 1 | first_name | Alec | | 2 | 1 | last_name | Jones | | 3 | 1 | occupation | engineer | | 4 | 2 | first_name | John | | 5 | 2 | last_name | Doe | | 6 | 2 | occupation | engineer | +------+------------+------------+-------------+
Supposons que vous souhaitiez créer un tableau croisé dynamique dynamique, de sorte qu'une nouvelle colonne soit créée pour chaque valeur unique dans field_key colonne, c'est-à-dire (first_name, last_name, occupation)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Créer des tableaux croisés dynamiques dans MySQL
Si vous savez déjà quelles colonnes créer dans le tableau croisé dynamique, vous pouvez utiliser une instruction CASE pour créer un tableau croisé dynamique. Cependant, pour créer des tableaux croisés dynamiques dans MySQL, nous utilisons GROUP_CONCAT pour transposer dynamiquement les lignes en colonnes, comme indiqué ci-dessous.
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when field_key = ''', field_key, ''' then field_value end) ', field_key ) ) INTO @sql FROM Meeting; SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting GROUP BY Meeting_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
GROUP_CONCAT vous permet de concaténer des valeurs de plusieurs lignes en une seule chaîne. Dans la requête ci-dessus, nous utilisons GROUP_CONCAT pour créer dynamiquement des instructions CASE, basées sur des valeurs uniques dans field_key colonne et stockez cette chaîne dans la variable @sql. Il est ensuite utilisé pour créer notre requête de sélection.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
De cette façon, vous pouvez automatiser les requêtes de tableau croisé dynamique dans MySQL.
Vous pouvez personnaliser la requête ci-dessus selon vos besoins en ajoutant la clause WHERE ou JOINS.
Si vous souhaitez faire pivoter uniquement les valeurs de ligne sélectionnées en tant que colonnes, vous pouvez ajouter la clause WHERE dans votre 1ère instruction select GROUP_CONCAT, comme indiqué en gras ci-dessous
SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when field_key = ''', field_key, ''' then field_value end) ', field_key ) ) INTO @sql FROM Meeting WHERE <condition>;
Si vous souhaitez filtrer les lignes de votre tableau croisé dynamique final, vous pouvez ajouter la clause WHERE dans votre instruction SET comme indiqué en gras ci-dessous.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting WHERE <condition> GROUP BY Meeting_id');
De même, vous pouvez également appliquer des JOINS dans votre requête SQL pendant que vous créez des tableaux croisés dynamiques dans MySQL.
Une fois que vous avez créé des tableaux croisés dynamiques dans MySQL, vous pouvez utiliser un outil de création de rapports pour le tracer dans un tableau. Voici un exemple de tableau croisé dynamique créé avec Ubiq.
Saviez-vous que vous pouvez créer des tableaux croisés dynamiques dans Ubiq sans écrire de SQL ?
Au fait, si vous souhaitez créer des tableaux croisés dynamiques, des graphiques et des tableaux de bord à partir de la base de données MySQL, vous pouvez essayer Ubiq. Nous offrons un essai gratuit de 14 jours.