MySQL - Retornar soma de valores por intervalo de hora
Tenho uma Tabela "VENDAS" com os seguintes atributos:
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:
id_venda INTEGER AUTO_INCREMENT PRIMARY KEY
valor REAL NOT NULL
data DATETIME NOT NULL
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
Curtidas 1
Melhor post
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
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
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
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
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
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?
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
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?
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