MySQL - Retornar soma de valores por intervalo de hora

05/04/2021

9

Tenho uma Tabela "VENDAS" com os seguintes atributos:

id_venda INTEGER AUTO_INCREMENT PRIMARY KEY
valor REAL NOT NULL
data DATETIME NOT NULL


Eu quero retornar em MySQL o total de vendas ocorridos no dia atual nos intervalos entre: 0h às 5h, 6h às 11, 12 às 17 e 18h às 23h.

Ficando mais ou menos assim:

HORÁRIO                TOTAL DE VENDIDO
0h - 5h                   150.00
6h - 11h                  230.00
12h - 17h                 100.50
18h - 23h                 800.00
Responder

Post mais votado

05/04/2021

tente algo assim:
select
   case
      when left(time(DATA),5) < '06:00' then '00h - 05h'
      when left(time(DATA),5) < '12:00' then '06h - 11h'
      when left(time(DATA),5) < '18:00' then '12h - 17h'
   else
      '18h - 23h'
   end HORARIO,
   sum(VALOR) TOTAL
from
   VENDAS
where
    date(DATA) = curdate()
group by
   case
      when left(time(DATA),5) < '06:00' then '00h - 05h'
      when left(time(DATA),5) < '12:00' then '06h - 11h'
      when left(time(DATA),5) < '18:00' then '12h - 17h'
   else
      '18h - 23h'
   end

Responder

Mais Posts

05/04/2021

Dudubacteria

Obrigado pela resposta, é exatamente assim, porém tem como retornar Valor zero quando não tiver nenhuma compra em determinado período? Por exemplo: Caso não tenha nenhuma compra no período de 0h às 5h, retorne zero Valor e prossiga com os demais como você fez.
Responder
select
   case
      when left(time(DATA),5) < '06:00' then '00h - 05h'
      when left(time(DATA),5) < '12:00' then '06h - 11h'
      when left(time(DATA),5) < '18:00' then '12h - 17h'
   else
      '18h - 23h'
   end HORARIO,
   coalesce(sum(VALOR),0) TOTAL
from
   VENDAS
where
    date(DATA) = curdate()
group by
   case
      when left(time(DATA),5) < '06:00' then '00h - 05h'
      when left(time(DATA),5) < '12:00' then '06h - 11h'
      when left(time(DATA),5) < '18:00' then '12h - 17h'
   else
      '18h - 23h'
   end
Responder

05/04/2021

Dudubacteria

Não deu certo amigo, no período onde não constava nenhuma compra não retornou nenhuma linha, trouxe apenas os período que tinha alguma venda.
Responder

06/04/2021

Dudubacteria

select
   case
      when left(time(DATA),5) < '06:00' then '00h - 05h'
      when left(time(DATA),5) < '12:00' then '06h - 11h'
      when left(time(DATA),5) < '18:00' then '12h - 17h'
   else
      '18h - 23h'
   end HORARIO,
   coalesce(sum(VALOR),0) TOTAL
from
   VENDAS
where
    date(DATA) = curdate()
group by
   case
      when left(time(DATA),5) < '06:00' then '00h - 05h'
      when left(time(DATA),5) < '12:00' then '06h - 11h'
      when left(time(DATA),5) < '18:00' then '12h - 17h'
   else
      '18h - 23h'
   end


Pode me ajudar mais uma vez amigo? Não está retornando zero caso ele não encontre uma venda em determinado turno.
Responder

06/04/2021

Matheus

O problema é que seu case esta em cima da DATA, caso a DATA não esteja no range X retorna "18h - 23h", com isso, quando não tem dado, não retorna.
Imagino que sua tabela seja alimentada por venda, se não tem venda na data "A", não tem registro, isso?
Se sim, seu select não retorna mesmo "0,00".

Ja fiz um banco que o time controlava por turno. A diferença é que eu fiz uma tabela de turno diário, e uma tabela de venda. Quando o sistema não identificava movimento em uma certa data, ele criava na tabela de turno um registro para esta data, com isso eu tenho o turno do dia "A" zerado, diferente da tua estrutura em que se não tem venda, não tem registro, correto?
Responder

07/04/2021

Dudubacteria

O problema é que seu case esta em cima da DATA, caso a DATA não esteja no range X retorna "18h - 23h", com isso, quando não tem dado, não retorna.
Imagino que sua tabela seja alimentada por venda, se não tem venda na data "A", não tem registro, isso?
Se sim, seu select não retorna mesmo "0,00".

Ja fiz um banco que o time controlava por turno. A diferença é que eu fiz uma tabela de turno diário, e uma tabela de venda. Quando o sistema não identificava movimento em uma certa data, ele criava na tabela de turno um registro para esta data, com isso eu tenho o turno do dia "A" zerado, diferente da tua estrutura em que se não tem venda, não tem registro, correto?


Exatamente amigo! Eu preciso fazer três relatórios: Diário, que retorna todas as vendas por turnos no dia atual e quando não tiver venda em determinado turno, retorne zero. Outro Semanal, que retorna todas vendas do dia atual, até o sexto dia anterior, quando não tiver venda, retorne zero para aquele dia. E um Mensal, que retorna todas vendas dos meses e quando não tiver venda em determinado mês, retorne zero no valor.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar