Mysql
 sql >> Database >  >> RDS >> Mysql

Come annullare il pivot della tabella in MySQL

A volte è necessario trasporre le colonne in righe o annullare il pivot in MySQL. Poiché MySQL non ha una funzione per UNPIVOT o REVERSE PIVOT di una tabella, è necessario scrivere una query SQL per trasporre le colonne in righe. Ecco come annullare il pivot della tabella in MySQL.

Come annullare il pivot della tabella in MySQL

Supponiamo che tu abbia la seguente tabella pivot

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   |
+------+------+------+------+

Supponiamo che tu voglia annullare il pivot della tabella in MySQL come segue.

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

Bonus Leggi: Come creare tabelle pivot dinamiche in MySQL

Unpivot tabella in MySQL

Ecco la query per fare unpivot in SQL. Poiché MySQL non offre una funzione UNPIVOT, è necessario utilizzare la clausola UNION ALL per eseguire il pivot inverso di una tabella in 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    |
+------+-----+-------+

Nella query precedente, fondamentalmente tagliamo la tabella originale in 3 tabelle più piccole, una per ogni colonna a, b, c e poi le aggiungiamo una sotto l'altra usando UNION ALL.

Se desideri filtrare le righe, puoi aggiungere una clausola WHERE come mostrato di seguito

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;

Bonus letto: Come trasporre righe in colonne in modo dinamico in MySQL

Sfortunatamente, è noioso ma uno degli unici 2 modi per annullare il pivot in MySQL. L'altro prevede l'esecuzione di un cross join, come mostrato di seguito.

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   |
+------+-----+------+

Bonus Lettura:Come automatizzare le query sulle tabelle pivot in MySQL

È possibile personalizzare la query precedente per annullare il pivot della tabella in MySQL, utilizzando la clausola WHERE. Puoi anche utilizzare uno strumento di reporting per tracciare il risultato in una tabella. Ecco un esempio di una tabella creata con Ubiq.

Se vuoi creare tabelle pivot, grafici e dashboard dal database MySQL, puoi provare Ubiq. Offriamo una prova gratuita di 14 giorni.