Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So entpivotieren Sie eine Tabelle in MySQL

Manchmal müssen Sie Spalten in Zeilen transponieren oder Tabellen in MySQL entpivotieren. Da MySQL keine Funktion zum UNPIVOT oder REVERSE PIVOT einer Tabelle hat, müssen Sie eine SQL-Abfrage schreiben, um Spalten in Zeilen zu transponieren. So entpivotieren Sie eine Tabelle in MySQL.

So entpivotieren Sie eine Tabelle in MySQL

Angenommen, Sie haben die folgende Pivot-Tabelle

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

Angenommen, Sie möchten die Tabelle in MySQL wie folgt entpivotieren.

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

Bonuslektüre: So erstellen Sie dynamische Pivot-Tabellen in MySQL

Unpivot-Tabelle in MySQL

Hier ist die Abfrage zum Entpivotieren in SQL. Da MySQL keine UNPIVOT-Funktion anbietet, müssen Sie die UNION ALL-Klausel verwenden, um eine Tabelle in MySQL umzukehren.

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

In der obigen Abfrage schneiden wir die ursprüngliche Tabelle im Grunde in 3 kleinere – eine für jede Spalte a,b,c – und hängen sie dann untereinander mit UNION ALL an.

Wenn Sie Zeilen filtern möchten, können Sie eine WHERE-Klausel wie unten gezeigt hinzufügen

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;

Bonuslektüre: How to Transpose Rows to Columns Dynamically in MySQL

Leider ist es mühsam, aber eine der wenigen Möglichkeiten, in MySQL zu entpivotieren. Die andere beinhaltet einen Cross Join, wie unten gezeigt.

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

Bonuslektüre:So automatisieren Sie Pivot-Tabellenabfragen in MySQL

Sie können die obige Abfrage anpassen, um die Pivot-Tabelle in MySQL mithilfe der WHERE-Klausel zu entpivotieren. Sie können auch ein Berichtstool verwenden, um das Ergebnis in einer Tabelle darzustellen. Hier ist ein Beispiel für eine mit Ubiq erstellte Tabelle.

Wenn Sie Pivot-Tabellen, Diagramme und Dashboards aus einer MySQL-Datenbank erstellen möchten, können Sie Ubiq ausprobieren. Wir bieten eine 14-tägige kostenlose Testversion an.