Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Fev 11, 2021 11:20 am Assunto: dúvida consulta SQL (mysql) |
|
|
Bom dia pessoal, estou com uma pequena dúvida numa SQL e gostaria da ajuda de vocês, o cenário é o seguinte:
Eu tenho uma tabela de pagamentos, nele eu tenho a data do próximo vencimento, estou querendo fazer uma SQL q me mostrasse todos os registros que vão vencer até um certo dia, até ai tudo bem, o problema é quando existe um pagamento q venceu antes dessa data escolhida e um outro que vai vencer depois dessa data escolhida, exemplo:
clientes
COD NOME
1 GUSTAVO
2 RAFAEL
COD CODCLI DATAVENCIMENTO
1 1 10/01/2021
2 1 10/03/2021
3 2 10/02/2021
nesse caso, se eu quiser fazer uma SQL q mostre os vencimentos até o dia 28/02/2021, ele vai mostrar o código 1, mas não pode mostrar pq tem um outro vencimento dia 10/03/2021, só é para mostrar caso não haja nenhum vencimento após a data escolhida
então teria q mostrar somente o cliente RAFAEL pq é o único q tem vencimento antes do dia 28/02/2021 e não tem nenhum vencimento após |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Fev 11, 2021 3:45 pm Assunto: |
|
|
Boa tarde,
Experimente fazer uns testes utilizando o operador Exists (not no caso). Ex:
Código: | select * from Pagamentos as p
where
p.DataVencimento <= :DataVencimento
not exists
(select 1 from Pagamentos as s
where s.CodCli = p.CodCli and s.DataVencimento > :DataVencimento) |
No exemplo acima foi utilizado um parâmetro para a data de vencimento limite, e esse parâmetro é utilizado duas vezes na consulta. Alguns componentes não aceitam dois parâmetros com o mesmo nome; se for o caso do componente que você está utilizando será necessário utilizar nomes diferentes mas a data passada deverá ser o mesma.
Espero que ajude
Editado pela última vez por imex em Qui Set 16, 2021 5:23 pm, num total de 1 vez |
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Fev 11, 2021 5:30 pm Assunto: |
|
|
meu amigo, vc é &%$#, MUITO obrigado mais uma vez...
imex escreveu: | Boa tarde,
Experimente fazer uns testes utilizando o operador Exists (not no caso). Ex:
Código: | select * from Pagamentos as p
where
p.DataVencimento <DataVencimento> :DataVencimento) |
No exemplo acima foi utilizado um parâmetro para a data de vencimento limite, e esse parâmetro é utilizado duas vezes na consulta. Alguns componentes não aceitam dois parâmetros com o mesmo nome; se for o caso do componente que você está utilizando será necessário utilizar nomes diferentes mas a data passada deverá ser o mesma.
Espero que ajude
|
|
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Fev 11, 2021 7:51 pm Assunto: |
|
|
só tem mais um detalhe que apareceu aqui, tb estão aparecendo os pagamentos dos meses anteriores, ex:
COD NOME
1 GUSTAVO
COD CODCLI DATAVENCIMENTO
1 1 10/01/2021
2 1 10/02/2021
então como tem um pagamento para o mês 02, significa que ele já pagou o do mês 01 pq o sistema só gera para o mês 02 se ele pagou o mês 01, então nesse caso só poderia aparecer o do mês 02 e com essa SQL está aparecendo os 2 meses. |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Fev 12, 2021 12:07 pm Assunto: |
|
|
Não tem nenhum campo na tabela de pagamentos para indicar se já foi pago ou não? A única forma é verificar se tem outro registro depois?
Segue uma sugestão para testes:
Código: | select * from Pagamentos as p
where
p.DataVencimento <= :DataVencimento
not exists
(select 1 from Pagamentos as s
where
s.CodCli = p.CodCli and
(s.DataVencimento > :DataVencimento or s.DataVencimento > p.DataVencimento)) |
Espero que ajude |
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qua Fev 17, 2021 7:39 pm Assunto: |
|
|
Deu certo meu amigo, MUITO obrigado...
imex escreveu: | Não tem nenhum campo na tabela de pagamentos para indicar se já foi pago ou não? A única forma é verificar se tem outro registro depois?
Segue uma sugestão para testes:
Código: | select * from Pagamentos as p
where
p.DataVencimento <DataVencimento> :DataVencimento or s.DataVencimento > p.DataVencimento)) |
Espero que ajude |
|
|
Voltar ao Topo |
|
|
|