Stack Overflow em Português Asked on September 26, 2021
Tenho uma tabela chamada OperacoesCaixa
e nela tenho os seguintes campos:
Cod, Valor, DataOp
Bom preciso fazer um select
que me retorne os lançamentos dos 3 últimos dias, porém não quero ter que informar uma data.
Supondo que tenho um lançamento realizado 15 dias a trás o select
tem que retornar os 3 último dias.
Eu tentei fazer da seguinte forma:
SELECT
*
FROM
OperacoesCaixa
WHERE
DataOp BETWEEN CURDATE() - INTERVAL 3 DAY AND CURDATE()
ORDER BY
DataOp
DESC
O problema e que ele pega a data atual, se não houver nenhum lançamento nos últimos 3 dias o select
não vai me retornar nada.
——– edit ——–
Bom para facilitar vou posta um exemplo real.
Vamos usar a data de 17-07-2020 como referência do dia da consulta.
Exemplo 1:
Tenho os seguintes dados na tabela:
Cod Valor DataOp
1 85.20 13-07-2020
2 97.14 13-07-2020
3 89 13-07-2020
4 100 15-07-2020
5 247.85 15-07-2020
6 58 16-07-2020
7 97 16-07-2020
8 86 16-07-2020
9 875 17-07-2020
10 85.20 17-07-2020
Bom o select
deve retornar o seguinte resultado:
10 85.20 17-07-2020
9 875 17-07-2020
8 86 16-07-2020
7 97 16-07-2020
6 58 16-07-2020
5 247.85 15-07-2020
4 100 15-07-2020
Ou seja, os lançamento dos 3 últimos dias.
Exemplo 2 notem que nos 3 últimos dias não houve lançamentos:
Tenho os seguintes dados na tabela:
Cod Valor DataOp
1 85.20 5-07-2020
2 97.14 5-07-2020
3 89 5-07-2020
4 100 8-07-2020
5 247.85 8-07-2020
6 58 9-07-2020
7 97 9-07-2020
8 86 10-07-2020
9 875 10-07-2020
10 85.20 10-07-2020
A resposta deve ser:
10 85.20 10-07-2020
9 875 10-07-2020
9 875 10-07-2020
8 86 10-07-2020
7 97 9-07-2020
6 58 9-07-2020
5 247.85 8-07-2020
4 100 8-07-2020
Resumindo independente da data de hoje quero que seja listado todos os registros dos 3 dias que houve registro.
Creio ser algo assim , posso ter errado em algum detalhe da síntaxe
--1
SELECT
distinct DataOp
FROM
OperacoesCaixa
order by DataOp desc
--2
select DataOp
from
(
SELECT
distinct DataOp
FROM
OperacoesCaixa
order by DataOp desc
) virtual limit 3
--3
select *
from
where DataOp in
(select DataOp
from
(
SELECT
distinct DataOp
FROM
OperacoesCaixa
order by DataOp desc
) virtual limit 3
) virtual2
Answered by Motta on September 26, 2021
Se são os últimos 3 dias, seria mais fácil dizer "data maior que data atual - 3", o que em um comando SQL seria:
WHERE DataOp > CURDATE() - INTERVAL 3 DAY
Pronto, vou deixar a query anterior, porque pode interessar a alguém.
Agora vamos ao caso da pergunta. Como precisa listar os valores todos, pegando as últimas datas, precisa de uma subquery. Se fossem totais, bastava agrupar por data, order e pegar as últimas 3, assim:
select DataOp, SUM(Valor) from OperacoesCaixa
group by DataOp
order by DataOp DESC
limit 3;
Como precisa listar tudo, podemos usar essa mesma query para selecionar as datas, removendo o SUM
é claro e colocar na query principal:
select * from OperacoesCaixa
where DataOp in (select * from (
select DataOp from OperacoesCaixa
group by DataOp
order by DataOp DESC
limit 3) as sub)
order by DataOp desc;
Note que, eu adicionei um segundo nível na subquery, isso porque a subquery direta dá erro ao usar o LIMIT
, que aqui é essencial para pegar as 3 datas apenas.
Veja aqui funcionando: https://www.db-fiddle.com/f/2X55LZBmqcFh7WHnaKMAfo/1
Answered by Ricardo Pontual on September 26, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP