Marcado: sql
- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 5 anos, 8 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
25 de março de 2019 às 4:33 pm #139142Fernanda MontovaniParticipante
Boa tarde Pessoal,
tenho uma tabela simples com os campos: data (data do cadastro), numero_parcelas ( números de parcelas de um financiamento) e valor_parcelas ( valor de cada parcela).
Com isso preciso fazer uma sql que a partir da data atual, mostre para mim quais registros terminam o financiamento em no máximo 6 meses,usei a sql abaixo para determinar a data final e esta show, mas ainda não consegui fazer uma condição no “where” que determinasse o fim do financiamento nos proximos 6 meses
SELECT V3.DATA AS “DATA-CADASTRO”, ADD_MONTHS(TRUNC(V3.DATA), v3.meses) DATA_FINAL FROM VENDA_FINANCIAMENTO V3
Se alguem puder me ajudar, ficarei muito agradecida.
🙂 bjs26 de março de 2019 às 11:14 am #139272José Laurindo ChiappaModeradorBlz ? 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.