Cross Table no MySql

19/06/2018

0

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.
Jorgito Paiva

Jorgito Paiva

Responder

Posts

09/07/2018

Leandro Meili

Criando seu exemplo no MySQL:
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
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar