À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.