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

Comment transposer dynamiquement des lignes en colonnes dans MySQL

Parfois, vos données peuvent être stockées dans des lignes et vous souhaiterez peut-être les signaler sous forme de colonnes. Dans ce cas, vous devrez transposer les lignes en colonnes. Parfois, même ces lignes peuvent être variables. Ainsi, vous savez peut-être de combien de colonnes vous avez besoin. Dans de tels cas, vous devez transposer dynamiquement les lignes en colonnes. Puisqu'il n'y a pas de fonction intégrée pour faire cela dans MySQL, vous devez l'accomplir en utilisant une requête SQL. Voici une requête SQL pour transposer dynamiquement des lignes en colonnes dans MySQL.

Comment transposer dynamiquement des lignes en colonnes dans MySQL

Voici comment créer des tableaux croisés dynamiques 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    |
+------------+-------------+-------------+-------------+

Transposer dynamiquement les lignes en colonnes

Si vous savez déjà quelles colonnes vous allez créer à l'avance, vous pouvez simplement utiliser une instruction CASE pour créer un tableau croisé dynamique.

Comme nous ne savons pas quelles colonnes créer, nous devrons transposer dynamiquement les lignes en colonnes à 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   |
+------------+------------+-----------+------------+

C'est ainsi que vous pouvez automatiser les requêtes de tableau croisé dynamique dans MySQL et transposer dynamiquement les lignes en colonnes.

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 transposez dynamiquement des lignes en colonnes dans MySQL.

Voici un exemple de tableau croisé dynamique créé avec Ubiq.

Si vous souhaitez créer des tableaux croisés dynamiques, des graphiques, des tableaux de bord et des rapports à partir de la base de données MySQL, vous pouvez essayer Ubiq. Nous offrons un essai gratuit de 14 jours.