MySQL - Retornar soma de valores por intervalo de hora

SQL

MySQL

Banco de Dados

05/04/2021

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
Dudubacteria

Dudubacteria

Curtidas 1

Melhor post

Emerson Nascimento

Emerson Nascimento

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

GOSTEI 1

Mais Respostas

Dudubacteria

Dudubacteria

05/04/2021

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.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

05/04/2021

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
GOSTEI 1
Dudubacteria

Dudubacteria

05/04/2021

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.
GOSTEI 0
Dudubacteria

Dudubacteria

05/04/2021

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.
GOSTEI 0
Matheus

Matheus

05/04/2021

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?
GOSTEI 1
Dudubacteria

Dudubacteria

05/04/2021

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.
GOSTEI 0
POSTAR