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.