Cross Table no MySql
Alguém sabe como implementar uma Cross Table no MySql para poder me ajudar? Preciso transformar uma query que retorna sempre 4 linhas de resultado para apenas 1 linha colocando cada campo das linha em colunas uma ao lado da outra, como ilustrado na imagem neste link: https://ibb.co/i3gRed
OBS: os valores do campo fila podem sempre variar.
OBS: os valores do campo fila podem sempre variar.
Jorgito Paiva
Curtidas 0
Respostas
Leandro Meili
19/06/2018
Criando seu exemplo no MySQL:
A query:
Como o MySQL 5.7 não tem uma função para gerar o número de cada linha, temos que improvisar e criar uma variável @row_number. Use também o order by na coluna data, já que eu imagino que data_fila_1 < data_fila_2 < data_fila_3 < data_fila_4
CREATE DATABASE testes; CREATE TABLE testes.registros( ticket int, fila int, data timestamp, history_id int ); INSERT INTO testes.registros(ticket,fila, data, history_id) VALUES (61100, 37, "2018-06-01 10:00:00", 1), (61100, 12, "2018-06-01 18:00:00", 16), (61100, 20, "2018-06-04 09:00:00", 16), (61100, 35, "2018-06-05 17:00:00", 16);
A query:
SET @row_number = 0; SELECT t1.ticket, max(CASE WHEN num=1 THEN t1.fila END) AS fila_1, max(CASE WHEN num=1 THEN t1.data END) AS data_fila_1, max(CASE WHEN num=2 THEN t1.fila END) AS fila_2, max(CASE WHEN num=2 THEN t1.data END) AS data_fila_2, max(CASE WHEN num=3 THEN t1.fila END) AS fila_3, max(CASE WHEN num=3 THEN t1.data END) AS data_fila_3, max(CASE WHEN num=4 THEN t1.fila END) AS fila_4, max(CASE WHEN num=4 THEN t1.data END) AS data_fila_4 FROM (SELECT ticket, fila, data, history_id, (@row_number:=@row_number + 1) AS num FROM testes.registros ORDER BY data) t1 GROUP BY ticket;
Como o MySQL 5.7 não tem uma função para gerar o número de cada linha, temos que improvisar e criar uma variável @row_number. Use também o order by na coluna data, já que eu imagino que data_fila_1 < data_fila_2 < data_fila_3 < data_fila_4
GOSTEI 0