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

Comment annuler le pivot d'une table dans MySQL

Parfois, vous devez transposer des colonnes en lignes ou détacher un tableau croisé dynamique dans MySQL. Étant donné que MySQL n'a pas de fonction pour UNPIVOT ou REVERSE PIVOT une table, vous devez écrire une requête SQL pour transposer les colonnes en lignes. Voici comment annuler le pivot d'une table dans MySQL.

Comment annuler le pivot d'une table dans MySQL

Disons que vous avez le tableau croisé dynamique suivant

mysql>create table data(id int, a varchar(255), b varchar(255), c varchar(255));
mysql>insert into data(id,a,b,c) values(1,'a1','b1','c1'),(2,'a1','b1','c1');
mysql>select * from data;

+------+------+------+------+
| id   | a    | b    | c    |
+------+------+------+------+
|    1 | a1   | b1   | c1   |
|    2 | a1   | b1   | c1   |
+------+------+------+------+

Supposons que vous souhaitiez annuler le pivot de la table dans MySQL vers ce qui suit.

1 | a1 | a
1 | b1 | b
1 | c1 | c
2 | a2 | a
2 | b2 | b
2 | c2 | c

Lecture bonus : Comment créer des tableaux croisés dynamiques dans MySQL

Unpivot Table dans MySQL

Voici la requête à faire unpivot en SQL. Étant donné que MySQL n'offre pas de fonction UNPIVOT, vous devez utiliser la clause UNION ALL pour inverser le pivot d'une table dans MySQL.

mysql> select id, 'a' col, a value
      from data
      union all
      select id, 'b' col, b value
      from data
      union all
      select id, 'c' col, c value
      from data;
+------+-----+-------+
| id   | col | value |
+------+-----+-------+
|    1 | a   | a1    |
|    2 | a   | a1    |
|    1 | b   | b1    |
|    2 | b   | b1    |
|    1 | c   | c1    |
|    2 | c   | c1    |
+------+-----+-------+

Dans la requête ci-dessus, nous avons essentiellement coupé la table d'origine en 3 tables plus petites - une pour chaque colonne a,b,c, puis les avons ajoutées l'une en dessous de l'autre en utilisant UNION ALL.

Si vous souhaitez filtrer les lignes, vous pouvez ajouter une clause WHERE comme indiqué ci-dessous

mysql> select id, 'a' col, a value
      from data
      WHERE condition
      union all
      select id, 'b' col, b value
      from data
      WHERE condition
      union all
      select id, 'c' col, c value
      from data
      WHERE condition;

Lecture bonus : Comment transposer dynamiquement des lignes en colonnes dans MySQL

Malheureusement, c'est fastidieux mais c'est l'un des 2 seuls moyens de dépivoter dans MySQL. L'autre consiste à faire une jointure croisée, comme indiqué ci-dessous.

mysql> select t.id,
       c.col,
       case c.col
         when 'a' then a
         when 'b' then b
         when 'c' then c
       end as data
     from data t
     cross join
     (
       select 'a' as col
       union all select 'b'
       union all select 'c'
     ) c;
+------+-----+------+
| id   | col | data |
+------+-----+------+
|    1 | a   | a1   |
|    2 | a   | a1   |
|    1 | b   | b1   |
|    2 | b   | b1   |
|    1 | c   | c1   |
|    2 | c   | c1   |
+------+-----+------+

Lecture bonus :Comment automatiser les requêtes de tableau croisé dynamique dans MySQL

Vous pouvez personnaliser la requête ci-dessus pour annuler le tableau croisé dynamique dans MySQL, en utilisant la clause WHERE. Vous pouvez également utiliser un outil de génération de rapports pour tracer le résultat dans un tableau. Voici un exemple de tableau 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.