Pular para o conteúdo

Fóruns SQL e PL/SQL condicao sql Responder a: condicao sql

#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