Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como desdinamizar a tabela no MySQL


Às vezes você precisa transpor colunas em linhas ou tabela unpivot no MySQL. Como o MySQL não tem uma função para UNPIVOT ou REVERSE PIVOT uma tabela, você precisa escrever uma consulta SQL para transpor colunas em linhas. Veja como desdinamizar a tabela no MySQL.


Como desdinamizar a tabela no MySQL


Digamos que você tenha a seguinte tabela dinâmica
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   |
+------+------+------+------+

Digamos que você queira desdinamizar a tabela no MySQL para o seguinte.
1 | a1 | a
1 | b1 | b
1 | c1 | c
2 | a2 | a
2 | b2 | b
2 | c2 | c



Bônus de leitura: Como criar tabelas dinâmicas no MySQL


Desativar tabela no MySQL


Aqui está a consulta para fazer unpivot no SQL. Como o MySQL não oferece uma função UNPIVOT, você precisa usar a cláusula UNION ALL para reverter o pivot de uma tabela no 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    |
+------+-----+-------+

Na consulta acima, basicamente cortamos a tabela original em 3 menores – uma para cada coluna a,b,c e, em seguida, anexamos uma abaixo da outra usando UNION ALL.



Se você deseja filtrar linhas, pode adicionar uma cláusula WHERE conforme mostrado abaixo
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;



Leitura bônus: Como transpor linhas para colunas dinamicamente no MySQL



Infelizmente, é tedioso, mas uma das únicas 2 maneiras de unpivot no MySQL. O outro envolve fazer uma junção cruzada, como mostrado abaixo.


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

Bônus de leitura:Como automatizar consultas de tabela dinâmica no MySQL



Você pode personalizar a consulta acima para unpivot table no MySQL, usando a cláusula WHERE. Você também pode usar uma ferramenta de relatório para plotar o resultado em uma tabela. Aqui está um exemplo de uma tabela criada usando Ubiq.





Se você deseja criar tabelas dinâmicas, gráficos e painéis do banco de dados MySQL, experimente o Ubiq. Oferecemos um teste gratuito de 14 dias.