Někdy je potřeba transponovat sloupce do řádků nebo zrušit kontingenční tabulku v MySQL. Vzhledem k tomu, že MySQL nemá funkci UNPIVOT nebo REVERSE PIVOT tabulky, musíte napsat SQL dotaz pro transponování sloupců do řádků. Zde je návod, jak zrušit kontingenční tabulku v MySQL.
Jak zrušit kontingenční tabulku v MySQL
Řekněme, že máte následující kontingenční tabulku
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 | +------+------+------+------+
Řekněme, že chcete zrušit kontingenční tabulku v MySQL na následující.
1 | a1 | a 1 | b1 | b 1 | c1 | c 2 | a2 | a 2 | b2 | b 2 | c2 | c
Bonusové čtení: Jak vytvářet dynamické kontingenční tabulky v MySQL
Uvolnění kontingenční tabulky v MySQL
Zde je dotaz, který se má provést unpivot v SQL. Protože MySQL nenabízí funkci UNPIVOT, musíte použít klauzuli UNION ALL pro obrácené pivotování tabulky v 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 |
+------+-----+-------+
Ve výše uvedeném dotazu jsme v podstatě rozřezali původní tabulku na 3 menší – jednu pro každý sloupec a,b,c a poté je přidali pod sebe pomocí UNION ALL.
Pokud chcete filtrovat řádky, můžete přidat klauzuli WHERE, jak je uvedeno níže
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;
Bonusové čtení: Jak dynamicky transponovat řádky do sloupců v MySQL
Bohužel je to zdlouhavé, ale je to jeden z mála způsobů, jak zrušit pivotování v MySQL. Druhý zahrnuje provedení křížového spojení, jak je znázorněno níže.
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 |
+------+-----+------+
Bonusové čtení:Jak automatizovat dotazy na kontingenční tabulky v MySQL
Výše uvedený dotaz můžete upravit tak, aby se v MySQL zbavil kontingenční tabulky pomocí klauzule WHERE. K vykreslení výsledku do tabulky můžete také použít nástroj pro vytváření sestav. Zde je příklad tabulky vytvořené pomocí Ubiq.

Pokud chcete vytvářet kontingenční tabulky, grafy a dashboardy z databáze MySQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.