Preciso de um SELECT que informe pagamento não efetuado
Estou com um problema que não consigo resolver!
Preciso de um select que, analisando duas tabelas: uma de Contrato outra de pagamento, me dê a relação das pessoas que naquele mês não efetuaram o pagamento.
Na tabela pagamento existe uma coluna com a data de vencimento e na tabela contrato a data inicial do contrato. Gostaria que houvesse um relacionamento, considerando estas duas variáveis, para saber se houve o pagamento naquele mês.
TABELAS:
CONTRATO
COD_CONTRATO,
CPF
ENDERECO
NUMERO
DATAINICIAL
DATAFINAL
VALORALUGUEL PAGAMENTO COD_PAGAMENTO
CPF
ENDERECO
NUMERO
MESREFERENCIA
DATAVENCIMENTO
DATAPAGAMENTO
VALORALUGUEL
VALORMULTA
VALORJUROS
VALORPAGAMENTO
CPF
ENDERECO
NUMERO
DATAINICIAL
DATAFINAL
VALORALUGUEL PAGAMENTO COD_PAGAMENTO
CPF
ENDERECO
NUMERO
MESREFERENCIA
DATAVENCIMENTO
DATAPAGAMENTO
VALORALUGUEL
VALORMULTA
VALORJUROS
VALORPAGAMENTO
Francisco Santos
Curtidas 0
Respostas
Emerson Nascimento
28/11/2010
creio que seja isso (não testei... nem sei se a sintaxe está correta, pois fiz diretamente no bloco de notas)
SELECT C.*,
(SELECT DATAPAGAMENTO FROM COD_PAGAMENTO CP
WHERE CP.COD_CONTRATO = C.COD_CONTRATO
AND EXTRACT(MONTH FROM DATAVENCIMENTO) = :MESREF
AND EXTRACT(YEAR FROM DATAVENCIMENTO) = :ANOREF) PAGO
FROM CONTRATO C
WHERE EXTRACT(YEAR FROM C.DATAINICIAL)+(EXTRACT(MONTH FROM C.DATAINICAL)/100.00) <= (:ANOREF+(:MESREF/100))
AND EXTRACT(YEAR FROM C.DATAFINAL)+(EXTRACT(MONTH FROM C.DATAFINAL)/100.00) >= (:ANOREF+(:MESREF/100))
essa instrução deve mostrar todos os contratos que contemplam o mês/ano indicado, e mostra a data do pagamento da parcela do referido mês - se ela tiver sido paga - na coluna PAGO. se não houve pagamento o valor deverá ser nulo.
para obter todos os que não efetuaram pagamento:
SELECT C.*,
FROM CONTRATO C
WHERE EXTRACT(YEAR FROM C.DATAINICIAL)+(EXTRACT(MONTH FROM C.DATAINICAL)/100.00) <= (:ANOREF+(:MESREF/100))
AND EXTRACT(YEAR FROM C.DATAFINAL)+(EXTRACT(MONTH FROM C.DATAFINAL)/100.00) >= (:ANOREF+(:MESREF/100))
AND NOT EXISTS(SELECT CP.DATAPAGAMENTO FROM COD_PAGAMENTO CP
WHERE CP.COD_CONTRATO = C.COD_CONTRATO
AND EXTRACT(MONTH FROM CP.DATAVENCIMENTO) = :MESREF
AND EXTRACT(YEAR FROM CP.DATAVENCIMENTO) = :ANOREF
AND NOT (CP.DATAPAGAMENTO IS NULL))
SELECT C.*,
(SELECT DATAPAGAMENTO FROM COD_PAGAMENTO CP
WHERE CP.COD_CONTRATO = C.COD_CONTRATO
AND EXTRACT(MONTH FROM DATAVENCIMENTO) = :MESREF
AND EXTRACT(YEAR FROM DATAVENCIMENTO) = :ANOREF) PAGO
FROM CONTRATO C
WHERE EXTRACT(YEAR FROM C.DATAINICIAL)+(EXTRACT(MONTH FROM C.DATAINICAL)/100.00) <= (:ANOREF+(:MESREF/100))
AND EXTRACT(YEAR FROM C.DATAFINAL)+(EXTRACT(MONTH FROM C.DATAFINAL)/100.00) >= (:ANOREF+(:MESREF/100))
essa instrução deve mostrar todos os contratos que contemplam o mês/ano indicado, e mostra a data do pagamento da parcela do referido mês - se ela tiver sido paga - na coluna PAGO. se não houve pagamento o valor deverá ser nulo.
para obter todos os que não efetuaram pagamento:
SELECT C.*,
FROM CONTRATO C
WHERE EXTRACT(YEAR FROM C.DATAINICIAL)+(EXTRACT(MONTH FROM C.DATAINICAL)/100.00) <= (:ANOREF+(:MESREF/100))
AND EXTRACT(YEAR FROM C.DATAFINAL)+(EXTRACT(MONTH FROM C.DATAFINAL)/100.00) >= (:ANOREF+(:MESREF/100))
AND NOT EXISTS(SELECT CP.DATAPAGAMENTO FROM COD_PAGAMENTO CP
WHERE CP.COD_CONTRATO = C.COD_CONTRATO
AND EXTRACT(MONTH FROM CP.DATAVENCIMENTO) = :MESREF
AND EXTRACT(YEAR FROM CP.DATAVENCIMENTO) = :ANOREF
AND NOT (CP.DATAPAGAMENTO IS NULL))
GOSTEI 0
Francisco Santos
28/11/2010
Obrigado Emerson!
Na realidade eu gostaria que o nome de quem não efetuou o pagamento foi listado em um dbgrid.
GOSTEI 0
Rodrigo Pereira
28/11/2010
Coloca onde data de pagamento is null, faz o join e na clausula where data de pagamento is null
GOSTEI 0
Emerson Nascimento
28/11/2010
para que o nome do devedor saia na relação, você precisa juntar a tabela onde esse nome está gravado.
GOSTEI 0