› Fóruns › SQL e PL/SQL › condicao sql › Responder a: condicao sql
Blz ? Ao que entendi da sua modelagem e pelo que vc falou, o que vc quer é calcular quantos MESES há entre a data final, do pagamento da última parcela, E o dia de hoje, aí vc quer filtrar para só aparecer os registros onde essa qtdade de meses faltante for <= 6, certo ??
Sendo isso, vamos por partes , primeiro deixa eu ter uma massinha de dados :
scott@DESENV:SQL>create table VENDA_FINANCIAMENTO (
2 data date , -- (data do cadastro)
3 numero_parcelas number(1,0) , -- ( números de parcelas de um financiamento)
4 valor_parcelas number(13,2) -- ( valor de cada parcela).
5* );
Tabela criada.
scott@DESENV:SQL>insert into VENDA_FINANCIAMENTO values(sysdate - 90, 3, 100);
1 linha criada.
scott@DESENV:SQL>insert into VENDA_FINANCIAMENTO values(sysdate - 180, 6, 200);
1 linha criada.
scott@DESENV:SQL>insert into VENDA_FINANCIAMENTO values(sysdate, 5, 300);
1 linha criada.
scott@DESENV:SQL>insert into VENDA_FINANCIAMENTO values(sysdate, 8, 400);
1 linha criada.
==> OK, agora vamos calcular a data final, tal como vc havia feito – eu só corrigi o erro (provavelmente de digitação) na chamada da ADD_MONTHS, onde vc referencia uma coluna MESES que não existe, coloquei no lugar dela a NUMERO_PARCELAS :
scott@DESENV:SQL>SELECT V3.DATA AS "DATA-CADASTRO", v3.numero_parcelas, ADD_MONTHS(TRUNC(V3.DATA), v3.NUMERO_PARCELAS) DATA_FINAL FROM VENDA_FINANCIAMENTO V3;
DATA-CADASTRO NUMERO_PARCELAS DATA_FINAL
------------------- --------------- -------------------
26/12/2018 09:41:49 3 26/03/2019 00:00:00
27/09/2018 09:42:32 6 27/03/2019 00:00:00
26/03/2019 09:42:50 5 26/08/2019 00:00:00
26/03/2019 10:00:31 8 26/11/2019 00:00:00
scott@DESENV:SQL>
==> Legal… Bom, no RDBMS Oracle é super-bico vc contar a qtdade de meses entre duas datas (que no caso são essa DATA_FINAL e a data de hoje, representada por SYSDATE), basta vc usar a built-in MONTHS_BETWEEN, exemplo :
scott@DESENV:SQL>SELECT V3.DATA AS "DATA-CADASTRO", v3.numero_parcelas, ADD_MONTHS(TRUNC(V3.DATA), v3.NUMERO_PARCELAS) DATA_FINAL,
2* MONTHS_BETWEEN(ADD_MONTHS(TRUNC(V3.DATA), v3.NUMERO_PARCELAS), SYSDATE) MESES_ATE_FIM_PARCELAS FROM VENDA_FINANCIAMENTO V3;
DATA-CADASTRO NUMERO_PARCELAS DATA_FINAL MESES_ATE_FIM_PARCELAS
------------------- --------------- ------------------- ----------------------
26/12/2018 09:41:49 3 26/03/2019 00:00:00 0
27/09/2018 09:42:32 6 27/03/2019 00:00:00 ,01759446
26/03/2019 09:42:50 5 26/08/2019 00:00:00 5
26/03/2019 10:00:31 8 26/11/2019 00:00:00 8
scott@DESENV:SQL>
==> okdoc, é só botar no WHERE a condição desejada… NO caso, como essa coluna DATA_FINAL e essa coluna MESES_ATE_FIM_PARCELAS são VIRTUAIS, são o resultado de um Cálculo/de um processamento, eu NÃO POSSO referenciar elas no WHERE diretamente :
scott@DESENV:SQL>SELECT V3.DATA AS "DATA-CADASTRO",
2 v3.numero_parcelas,
3 ADD_MONTHS(TRUNC(V3.DATA), v3.NUMERO_PARCELAS) DATA_FINAL,
4 MONTHS_BETWEEN(ADD_MONTHS(TRUNC(V3.DATA), v3.NUMERO_PARCELAS), SYSDATE) MESES_ATE_FIM_PARCELAS
5 FROM VENDA_FINANCIAMENTO V3
6* WHERE MESES_ATE_FIM_PARCELAS <= 6;
WHERE MESES_ATE_FIM_PARCELAS <= 6
*
ERRO na linha 6:
ORA-00904: "MESES_ATE_FIM_PARCELAS": invalid identifier
==> Claro, eu poderia REPETIR os mesmos cálculos que fiz no SELECT lá no WHERE mas o mais prático é você MATERIALIZAR essas colunas virtuais, faça de conta que vc tem uma tabela T composta pelos cálculos e pelos dados extraídos da VENDA_FINANCIAMENTO : aí vc PODE usar seja no WHERE, seja no ORDER BY ou onde quiser as colunas virtuais… Isso se faz com uma sub-query, tipo :
scott@DESENV:SQL>SELECT *
2 FROM (SELECT
3 DATA AS "DATA-CADASTRO",
4 numero_parcelas,
5 ADD_MONTHS(TRUNC(DATA), NUMERO_PARCELAS) DATA_FINAL,
6 MONTHS_BETWEEN(ADD_MONTHS(TRUNC(DATA), NUMERO_PARCELAS), SYSDATE) MESES_ATE_FIM_PARCELAS
7 FROM VENDA_FINANCIAMENTO
8 ) T
9* WHERE T.MESES_ATE_FIM_PARCELAS <= 6;
DATA-CADASTRO NUMERO_PARCELAS DATA_FINAL MESES_ATE_FIM_PARCELAS
------------------- --------------- ------------------- ----------------------
26/12/2018 09:41:49 3 26/03/2019 00:00:00 0
27/09/2018 09:42:32 6 27/03/2019 00:00:00 ,01729428
26/03/2019 09:42:50 5 26/08/2019 00:00:00 5
scott@DESENV:SQL>
Tendeu ??
[]s