Pular para o conteúdo

Marcado: 

  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 5 anos, 8 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #139142
    Avatar de Fernanda MontovaniFernanda Montovani
    Participante

      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.
      🙂 bjs

      #139272
      Avatar photoJosé Laurindo Chiappa
      Moderador

        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

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress