Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tchaves

Group By por horário de fechamento de chamado

Recommended Posts

Olá pessoa, boa tarde!

 

Gostaria da ajuda dos senhores para me ajudar a arrumar uma Query. Tenho um sistema de chamado e estou gerando alguns gráficos fazendo algumas consultas no banco.

 

Neste momento estou atrás de uma Query que me retorne a data (com horário) que os chamados estão sendo fechados. Então com posse desta informação o próximo passo seria juntar com Group By a quantidade de chamados fechados por hora e depois fazer um relatório. Então eu fiz:

 

mysql> SELECT DATE_FORMAT(max(ticket_history.change_time), '%H:00:00') AS Closed, COUNT(ticket.tn) Quantity FROM ticket_history LEFT JOIN ticket ON (ticket.id = ticket_history.ticket_id) WHERE ticket_history.history_type_id = 27 AND ticket_history.state_id IN (2,3) GROUP BY ticket.tn LIMIT 10;
+----------+----------+
| Closed | Quantity |
+----------+----------+
| 09:00:00 | 1 |
| 10:00:00 | 1 |
| 21:00:00 | 1 |
| 19:00:00 | 1 |
| 11:00:00 | 1 |
| 11:00:00 | 2 |
| 15:00:00 | 1 |
| 15:00:00 | 1 |
| 15:00:00 | 1 |
| 11:00:00 | 1 |
+----------+----------+

Reparem que o horário das 11:00 aparece 3 vezes e eu queria juntar para que ficasse: 11:00:00 | 3. Então fiz a Query abaixo e me retornou o seguinte erro:

 

mysql> SELECT DATE_FORMAT(max(ticket_history.change_time), '%H:00:00') AS Closed, COUNT(ticket.tn) Quantity FROM ticket_history LEFT JOIN ticket ON (ticket.id = ticket_history.ticket_id) WHERE ticket_history.history_type_id = 27 AND ticket_history.state_id IN (2,3) GROUP BY Closed LIMIT 10;
ERROR 1056 (42000): Can't group on 'Closed'

 

Alguém poderia me ajudar com esta consulta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Remova o MAX de dentro do DATE_FORMAT, você está utilizando uma função agregada do GROUP BY no próprio campo do GROUP BY, isso não deve funcionar corretamente, se quiser, pode utilizar uma sub-query ara filtrar a última data informada.

SELECT *
FROM tabela
WHERE horario = (
  SELECT MAX(horario) FROM tabela
)

Lembrando que para este caso específico, a sub-query não pode ter mais de 1 linha e 1 coluna.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa lokaodomau você novamente salvando a pátria :D

 

Então, cara, eu fiz o que você disse e tive o resultado esperado. Queria saber se está correto agora desta maneira. Forte abraço meu chapa!

 

mysql> SELECT DATE_FORMAT(ticket_history.change_time, '%H:00:00') AS Closed, COUNT(ticket.tn) Quantity FROM ticket_history LEFT JOIN ticket ON (ticket.id = ticket_history.ticket_id) WHERE ticket.create_time between '2015-06-01' and '2015-06-30' AND ticket_history.history_type_id = 27 AND ticket_history.state_id IN (2,3) GROUP BY Closed;
+----------+----------+
| Closed | Quantity |
+----------+----------+
| 01:00:00 | 1 |
| 08:00:00 | 30 |
| 09:00:00 | 56 |
| 10:00:00 | 52 |
| 11:00:00 | 57 |
| 12:00:00 | 14 |
| 13:00:00 | 9 |
| 14:00:00 | 30 |
| 15:00:00 | 57 |
| 16:00:00 | 57 |
| 17:00:00 | 60 |
| 18:00:00 | 16 |
+----------+----------+
12 rows in set (0.01 sec)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que esteja sim, mas caso o campo `create_time` seja DATETIME, dentro do WHERE, o banco entende somente a data como sendo 00:00:00, o ideal seria utilizar a função DATE() para filtrar somente pela data, veja um exemplo:

SELECT NOW() AS agora, DATE(NOW()) AS hoje, CURDATE() AS hojeTambem

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.