Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer des tableaux croisés dynamiques dans MySQL

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.