sql >> Database >  >> RDS >> Mysql

Tabel ongedaan maken in MySQL

Soms moet u kolommen in rijen transponeren of de draaitabel in MySQL ongedaan maken. Aangezien MySQL geen functie heeft om een ​​tabel ONPIVOT of OMGEKEERD te draaien, moet u een SQL-query schrijven om kolommen in rijen te transponeren. Hier leest u hoe u de draaitabel in MySQL ongedaan maakt.

De draaiing van de tabel in MySQL ongedaan maken

Stel dat u de volgende draaitabel heeft

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

Stel dat u de draaitabel in MySQL naar het volgende wilt ongedaan maken.

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

Bonus Lezen:Dynamische draaitabellen maken in MySQL

Tabel ongedaan maken in MySQL

Hier is de query om het draaien in SQL ongedaan te maken. Aangezien MySQL geen UNPIVOT-functie biedt, moet u de UNION ALL-clausule in gebruiken om een ​​tabel in MySQL om te draaien.

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 de bovenstaande query hebben we de oorspronkelijke tabel in feite in 3 kleinere geknipt - één voor elke kolom a, b, c en deze vervolgens onder elkaar toegevoegd met UNION ALL.

Als u rijen wilt filteren, kunt u een WHERE-component toevoegen, zoals hieronder weergegeven

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;

Lees bonus: Hoe u rijen dynamisch naar kolommen kunt transponeren in MySQL

Helaas is het vervelend, maar een van de weinige 2 manieren om het draaien in MySQL ongedaan te maken. De andere is het doen van een cross-join, zoals hieronder weergegeven.

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

Bonus lezen:hoe u draaitabelquery's in MySQL kunt automatiseren

U kunt de bovenstaande query aanpassen om de draaitabel in MySQL ongedaan te maken, met behulp van de WHERE-clausule. U kunt ook een rapportagetool gebruiken om het resultaat in een tabel te plotten. Hier is een voorbeeld van een tabel gemaakt met Ubiq.

Als u draaitabellen, grafieken en dashboards wilt maken vanuit de MySQL-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen.

  1. Wat zijn PLSQL-records in Oracle?

  2. Hoe te repareren "EXECUTE-instructie is mislukt omdat de WITH RESULT SETS-clausule 1 resultaatset (s) heeft gespecificeerd ..." in SQL Server

  3. Hoe krijg ik lokale gegevens in een alleen-lezen database met dplyr?

  4. hoe globale variabele declareren in SQL Server ..?