sql >> Databáze >  >> RDS >> Mysql

Jak zrušit kontingenční tabulku v MySQL

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.

  1. Příklady DAYOFMONTH() – MySQL

  2. Jak odstranit duplicitní řádky bez jedinečného identifikátoru

  3. ROW_NUMBER() v MySQL

  4. Jak změnit datový typ sloupce v databázi SQL bez ztráty dat