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.