Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa Noite
Tenho uma tabela de preços, criei a seguinte query. Porém não estou conseguindo concluir
Preciso de uma ajuda! Nesse código preciso, tirar o percentual de aumento entre os procedimentos (CD_PROCEDIMENTO)
Os que tem data de vigência final são os valores anterior e os que não tem vigência final (null) são os valores atuais.
Preciso pegar o valor do (cd_procedimento) da data final (A.DT_FINAL_VIGENCIA) diminuir do mesmo valor do (cd_procedimento) só que da data de vigência final= null.
Daí tirar o percentual de quantos teve de aumento.
Será que alguém sabe como fazer esse calculo direto aqui nessa query .??
Atualmente ela trás o valor do procedimento atual e o ultimo com vigência final!
___________________________
SELECT DISTINCT
B.DS_CONVENIO,
TO_CHAR( A.DT_INICIO_VIGENCIA, 'DD/MM/YYYY')DT_INICIO_VIGENCIA,
TO_CHAR( A.DT_FINAL_VIGENCIA, 'DD/MM/YYYY')DT_FINAL_VIGENCIA,
A.VL_PROC_AJUSTADO,
A.CD_PROCEDIMENTO,
C.DS_PROC_INTERNO,
D.DS_PLANO
FROM REGRA_AJUSTE_PROC A
LEFT JOIN PROCEDIMENTO C ON (A.CD_PROCEDIMENTO = C.CD_PROCEDIMENTO)
LEFT JOIN CONVENIO B ON (A.CD_CONVENIO = B.CD_CONVENIO)
LEFT JOIN CONVENIO_PLANO D ON (A.CD_PLANO = D.CD_PLANO)
WHERE B.IE_SITUACAO = 'A'
AND C.DS_PROC_INTERNO IS NOT NULL
AND A.DT_FINAL_VIGENCIA IS NULL
UNION ALL
SELECT DISTINCT
B.DS_CONVENIO,
TO_CHAR( A.DT_INICIO_VIGENCIA, 'DD/MM/YYYY')DT_INICIO_VIGENCIA,
TO_CHAR( A.DT_FINAL_VIGENCIA, 'DD/MM/YYYY')DT_FINAL_VIGENCIA,
A.VL_PROC_AJUSTADO,
A.CD_PROCEDIMENTO,
C.DS_PROC_INTERNO,
D.DS_PLANO
FROM REGRA_AJUSTE_PROC A
LEFT JOIN PROCEDIMENTO C ON (A.CD_PROCEDIMENTO = C.CD_PROCEDIMENTO)
LEFT JOIN CONVENIO B ON (A.CD_CONVENIO = B.CD_CONVENIO)
LEFT JOIN CONVENIO_PLANO D ON (A.CD_PLANO = D.CD_PLANO)
WHERE B.IE_SITUACAO = 'A'
AND C.DS_PROC_INTERNO IS NOT NULL
AND TRUNC(A.DT_FINAL_VIGENCIA ) IN(
SELECT DISTINCT TRUNC(MAX(J.DT_FINAL_VIGENCIA))
FROM REGRA_AJUSTE_PROC J WHERE A.CD_CONVENIO = J.CD_CONVENIO)
ORDER BY 1,6
Motta ! deu certo! Obrigada pela dica!
Só outra questão, talvez consiga me ajudar!
Ele compara o valor do campo (VL_PROC_AJUSTADO) pelas datas (null) e (ultima data finalizada).
Porém quando não existe uma data finalizada ( ele não tem com o que comparar). Ele não trás esse valor.
Mas preciso que traga!. Sabe como deve fazer?
o código agora está assim:
SELECT DISTINCT
B.DS_CONVENIO,
TO_CHAR( A.DT_INICIO_VIGENCIA, 'DD/MM/YYYY')DT_INICIO_VIGENCIA,
TO_CHAR(A.DT_FINAL_VIGENCIA, 'DD/MM/YYYY')DT_FINAL_ATUAL,
(A.VL_PROC_AJUSTADO)VALOR_ATUAL,
(P.VL_PROC_AJUSTADO)VALOR_ANTERIOR,
TO_CHAR(P.DT_FINAL_VIGENCIA,'DD/MM/YYYY')DT_FINAL_ANTERIOR,
(A.VL_PROC_AJUSTADO-P.VL_PROC_AJUSTADO)*10/100 AS PERCENTUAL,
A.CD_PROCEDIMENTO,
C.DS_PROC_INTERNO
FROM REGRA_AJUSTE_PROC A JOIN REGRA_AJUSTE_PROC P ON A.CD_PROCEDIMENTO= P.CD_PROCEDIMENTO
LEFT JOIN PROCEDIMENTO C ON (A.CD_PROCEDIMENTO = C.CD_PROCEDIMENTO AND P.CD_PROCEDIMENTO = C.CD_PROCEDIMENTO )
LEFT JOIN CONVENIO B ON (A.CD_CONVENIO = B.CD_CONVENIO AND P.CD_CONVENIO = B.CD_CONVENIO )
WHERE B.IE_SITUACAO = 'A'
AND C.DS_PROC_INTERNO IS NOT NULL
AND A.DT_FINAL_VIGENCIA IS NULL
AND B.CD_CONVENIO <>'96'
AND TRUNC(P.DT_FINAL_VIGENCIA) IN(
SELECT DISTINCT TRUNC(MAX(J.DT_FINAL_VIGENCIA))
FROM REGRA_AJUSTE_PROC J WHERE P.CD_CONVENIO = J.CD_CONVENIO )descobri que é por causa dessa linha;
LEFT JOIN CONVENIO B ON (A.CD_CONVENIO = B.CD_CONVENIO AND P.CD_CONVENIO = B.CD_CONVENIO )
Na tabela virtual o campo (p.cd_convenio) , quando não tem aumento de valor ele não trás a linha no caso. só que se eu tirar a parte (P.CD_CONVENIO = B.CD_CONVENIO) ele trás qualquer outro valor que não é correto.
No caso eu preciso que traga os que não teve aumento também. como percentual 0. e os campos (cd_conveio) da tabela virtual null no caso.
Não sei se consegue me entender ?Faça um outer join e trate o valor como zero (coalesce).
Como? não estou conseguindo!.
seria assim ?
SELECT
N.CD_CONVENIO+COALESCE(N.CD_CONVENIO,0))CD_CONVENIO
FULL OUTER JOIN REGRA_AJUSTE_PROC N ON A.CD_PROCEDIMENTO= N.CD_PROCEDIMENTOA síntaxe é LEFT ou RIGTH
A síntaxe é LEFT ou RIGTH (outter join>) conforme a tabela a ter o "outer join" , mas qual seria o "aumento" se não existe o valor novo ?
A sintaxe é left!
Então mesmo que não tenha o aumento precisa aparacer a linha com o valor que está. Para saber também os que não tiveram aumento.
Blz
http://respostas.guj.com.br/14718-calculos-com-a-mesma-coluna
No lugar de um UNION faça um JOIN (usando tabelas virtuais) entre os valores , ficando fácil calcular o percentual de aumento.