DESAFIO - Obter parcelas mais antigas em SQL

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Dionísio
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 11 Set 2009 2:40 pm
Localização: Macapá - AP
Dionísio Júnior
Analista de Sistemas
Unimed Macapá

Olá pessoal,

estou com uma dúvida quanto a obter o resultado de um relatório em SQL.

A questão é o seguinte:

Trabalho em uma operadora de plano de saúde, e queremos pegar parcelas em aberto de usuários que não pagaram seus planos nos anos de 2007 e 2008. Fiz a query sem problemas, e alguns usuários retornaram mais de 8 parcelas em aberto no período. O problema é que por lei, não podemos cobrar as 8 parcelas, podemos cobrar no máximo duas, das oito parcelas.
Esse é o X da questão: como adaptar essa query para que ele possa pegar apenas as duas parcelas mais antigas das oito ou mais parcelas que aparecerem?????

A query que faz a busca das parcelas é essa a seguir:

Selecionar tudo

select distinct
       ven.ven_cbn_cod_contrato "CONTRATO",
       decode(cbn.cbn_status,'A','ATIVO','R','RESCINDIDO','S','SUSPENSO') "STATUS",
       psf.psf_nome "CONTRATANTE",
       psf.psf_numero_cpf "CPF",
       trunc((sysdate-psf.psf_data_nascimento)/365) "IDADE",
       tpl.tpl_abreviacao||' '||nml.nml_nome "ENDERECO",
       epe.epe_numero "NUMERO",
       brr.brr_nome "BAIRRO",
       lbr.lbr_cep "CEP",
       nup.nup_nome "MUNICIPIO",
       nup.nup_est_sigla "UF",
       ven.ven_codigo_venda "VENDA",
       to_char(prc.prc_data_vencimento,'dd/mm/yyyy') "VENCIMENTO",
       prc.prc_valor "VALOR",
       trunc(sysdate - prc.prc_data_vencimento) "DIAS EM ATRASO"
from
       inf_vendas ven
join   inf_parcelas_receber prc on (ven.ven_codigo_venda = prc.prc_ven_codigo_venda)
join   inf_contratos_de_beneficiario cbn on (ven.ven_cbn_cod_contrato = cbn.cbn_cod_contrato)
join   inf_pessoas_fisicas psf on (cbn.cbn_pss_cod_pessoa = psf.psf_pss_cod_pessoa)
join   inf_enderecos_pessoa epe on (psf.psf_pss_cod_pessoa = epe.epe_pss_cod_pessoa)
join   inf_logradouros lbr on (epe.epe_lbr_codigo_lograd = lbr.lbr_codigo_lograd)
join   inf_tipos_logradouros tpl on (lbr.lbr_tpl_codigo_tipo = tpl.tpl_codigo_tipo)
join   inf_nomes_logradouros nml on (lbr.lbr_nml_codigo_nome = nml.nml_codigo_nome)
join   inf_bairros brr on (lbr.lbr_brr_codigo_bairro = brr.brr_codigo_bairro)
join   inf_municipios nup on (brr.brr_nup_codigo_municipio = nup.nup_codigo_municipio)
where
       prc.prc_data_recebimento is null and
       prc.prc_data_vencimento between '01/01/2007' and '31/12/2008' and
       ven.ven_cancelada != 'S'
group by
       ven.ven_cbn_cod_contrato,
       cbn.cbn_status,
       psf.psf_nome,
       psf.psf_numero_cpf,
       trunc((sysdate-psf.psf_data_nascimento)/365),
       tpl.tpl_abreviacao||' '||nml.nml_nome,
       epe.epe_numero,
       brr.brr_nome,
       lbr.lbr_cep,
       nup.nup_nome,
       nup.nup_est_sigla,
       ven.ven_codigo_venda,
       to_char(prc.prc_data_vencimento,'dd/mm/yyyy'),
       prc.prc_valor,
       trunc(sysdate - prc.prc_data_vencimento)
Com esta select, tem usuários que vem com 8 ou mais parcelas. Preciso que pra esses usuários, apareçam no máximo duas parcelas e tem que ser as mais antigas.

Espero ter sido compreendido e espero a ajuda de vocês, urgente pessoal!!!
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

De uma forma rapida, acho que isso aqui resolverá:

Selecionar tudo

select * from
(
  select a.* 
       , row_number() over ( partition by a.contrato order by a.vencimento asc ) rn
  from
  (
    sua_query_aqui
  ) a
)
where rn <= 2

Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes