ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

dúvida consulta SQL (mysql)

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Fev 11, 2021 11:20 am    Assunto: dúvida consulta SQL (mysql) Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Fev 11, 2021 3:45 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Fev 11, 2021 5:30 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Fev 11, 2021 7:51 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Fev 12, 2021 12:07 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qua Fev 17, 2021 7:39 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB