Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak unpivot tabelę w MySQL

Czasami trzeba transponować kolumny na wiersze lub unpivot table w MySQL. Ponieważ MySQL nie ma funkcji UNPIVOT lub REVERSE PIVOT tabeli, musisz napisać zapytanie SQL, aby przetransponować kolumny na wiersze. Oto jak unpivot tabeli w MySQL.

Jak unpivot tabeli w MySQL

Załóżmy, że masz następującą tabelę przestawną

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

Załóżmy, że chcesz unpivot tabeli w MySQL do następującego.

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

Przeczytaj dodatkowe: Jak tworzyć dynamiczne tabele przestawne w MySQL

Tabela Unpivot w MySQL

Oto zapytanie do wykonania unpivot w SQL. Ponieważ MySQL nie oferuje funkcji UNPIVOT, musisz użyć klauzuli UNION ALL, aby odwrócić tabelę przestawną w 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    |
+------+-----+-------+

W powyższym zapytaniu zasadniczo podzieliliśmy oryginalną tabelę na 3 mniejsze – po jednej dla każdej kolumny a,b,c, a następnie dołączyliśmy je jedna pod drugą za pomocą UNION ALL.

Jeśli chcesz filtrować wiersze, możesz dodać klauzulę WHERE, jak pokazano poniżej

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;

Przeczytaj bonus: Jak dynamicznie transponować wiersze do kolumn w MySQL

Niestety jest to żmudne, ale jeden z dwóch sposobów na unpivot w MySQL. Drugi polega na wykonaniu połączenia krzyżowego, jak pokazano poniżej.

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

Przeczytaj bonus:Jak zautomatyzować zapytania tabel przestawnych w MySQL

Możesz dostosować powyższe zapytanie do tabeli unpivot w MySQL, używając klauzuli WHERE. Możesz także użyć narzędzia do raportowania, aby wykreślić wyniki w tabeli. Oto przykład tabeli utworzonej za pomocą Ubiq.

Jeśli chcesz tworzyć tabele przestawne, wykresy i pulpity nawigacyjne z bazy danych MySQL, możesz wypróbować Ubiq. Oferujemy 14-dniowy bezpłatny okres próbny.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Migracja bazy danych MySQL z Amazon RDS do DigitalOcean

  2. Używaj relacyjnych baz danych MySQL w CentOS 5

  3. Jak wykonać mysqldump bez pytania o hasło?

  4. Jak zastosować metodę bindValue w klauzuli LIMIT?

  5. Przewodnik po projektowaniu bazy danych dla powiadomień w MySQL