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

Comment afficher les valeurs des lignes sous forme de colonnes dans MySQL

Parfois, vous devrez peut-être transposer des lignes en colonnes ou créer des tableaux croisés dynamiques à des fins de création de rapports. Puisqu'il n'y a pas de fonction intégrée pour réaliser le pivot dans MySQL, vous devez l'accomplir via une requête SQL pour créer un tableau de rapport pivot. Voyons comment afficher les valeurs des lignes sous forme de colonnes dans MySQL.

Comment afficher les valeurs des lignes sous forme de colonnes dans MySQL

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 transposer dynamiquement des lignes en colonnes, 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    |
+------------+-------------+-------------+-------------+

Afficher les valeurs des lignes sous forme de colonnes dans MySQL

Si vous savez déjà quelles colonnes vous souhaitez créer, vous pouvez créer un tableau croisé dynamique à l'aide des instructions CASE, comme indiqué ci-dessous, pour afficher les valeurs des lignes sous forme de colonnes dans MySQL.

mysql> select meeting_Id,
         max(case when (field_key='first_name') then field_value else NULL end) as 'first_name',
         max(case when (field_key='last_name') then field_value else NULL end) as 'last_name',
         max(case when (field_key='occupation') then field_value else NULL end) as 'occupation'
         from meeting
         group by meeting_Id
         order by meeting_Id;
+------------+------------+-----------+------------+
| meeting_Id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Afficher dynamiquement les valeurs des lignes sous forme de colonnes dans MySQL

Si vous ne connaissez pas les noms de colonnes à l'avance ou si vous souhaitez afficher dynamiquement les valeurs des lignes sous forme de colonnes dans MySQL, vous pouvez créer des tableaux croisés dynamiques dans MySQL à l'aide de la fonction GROUP_CONCAT, 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 les valeurs field_key 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 les valeurs uniques dans field_key colonne et stockez cette chaîne dans la variable @sql, qui est ensuite utilisée pour créer notre requête de sélection.

+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Vous pouvez personnaliser la requête ci-dessus selon vos besoins en ajoutant la clause WHERE ou JOINS.

Si vous souhaitez transposer uniquement les valeurs de ligne sélectionnées en colonnes, vous pouvez ajouter la clause WHERE dans votre 1ère instruction select GROUP_CONCAT.

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.

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 affichez les valeurs des lignes sous forme de colonnes dans MySQL.

Après avoir converti une ligne en colonne dans MySQL, vous pouvez utiliser un outil graphique pour tracer le résultat dans un tableau. Voici un exemple de tableau croisé dynamique créé avec Ubiq.

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.