none
Status data vencimento RRS feed

  • Pergunta

  • Bom dia!

    Prezados estou desenvolvendo a SQL abaixo que estava OK, porem e deparei com a seguinte situação:


    Meu Problema e nesse case Situação do Contrato.

      , CASE WHEN XC.PERMUTA IN ('01') THEN 'Permuta' 
             WHEN XC.PERMUTA IN ('02') THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('03') THEN 'Ação Judicial(Jurídico)'
             WHEN XC.PERMUTA IN ('04') THEN 'Pedido de Distrato'
             WHEN XC.PERMUTA IN ('05') THEN 'Em Negociação'
             WHEN XC.PERMUTA IN ('06') THEN 'Ação Judicial(Distrato Inadimplente)'
             WHEN XC.PERMUTA IN ('07') THEN 'Venda com Permura'
             WHEN   datediff(day,DATAVENC,gETDATE()) >= 15 THEN 'Inadimplente'
    ELSE 'Adimplente' END 'Situacao Contrato',  

    Eu preciso ler seguinte quanto condição código ISNULL (XC.PERMUTA ,0)AS Código for 0 eu preciso colocar no case acima para ele pegar a primeira date vencimento


    Vencimento   Situação      Contrato Parcela Vencido Código   Dias de Abertura
    15/12/2018  Inadimplente 1 0 202
    18/12/2018  Inadimplente 1 0 199
    18/06/2019  Inadimplente 1 0 17
    18/07/2019  Adimplente 0 0 -13
    20/07/2019  Adimplente 0 0 -15
    30/07/2019  Adimplente 0 0 -25

    Resultado esperado que ele pegue a primeira data vencimento e na situação contrato seja inadimplente se codigo for 0.


    quinta-feira, 4 de julho de 2019 13:35

Respostas

  • Você esta listando vários contratos?

     Para pegar a menor data de um contrato especifico você pode usar uma função de janela chamava FIRST_VALUE.

     De uma olhada no código abaixo que fiz antes de você colocar seu SQL inteiro

    create table Contrato
    (
    cod_contrato int,
    PERMUTA  char(2)
    );
    insert into Contrato(cod_contrato, PERMUTA) VALUES (1, '00');
    insert into Contrato(cod_contrato, PERMUTA) VALUES (2, '00');
    
    create table ContratoParcela
    (
     cod_contrato int,
     dataVenc date,
    );
    
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2018-12-05');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2018-12-18');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-06-18');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-07-18');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-07-20');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-07-30');
    
    INSERT INTO ContratoParcela(cod_contrato, dataVenc) VALUES (2, '2019-07-20');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (2, '2019-07-30');
    
    
    select 
    xc.cod_contrato,
    xc.permuta,
    p.datavenc as Vencimento
    ,CASE    WHEN isnull(XC.PERMUTA,'00')='00' AND 
             datediff(day, FIRST_VALUE(P.DATAVENC) OVER (PARTITION BY XC.COD_CONTRATO ORDER BY P.DATAVENC), GETDATE()) >= 15 THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('01') THEN 'Permuta' 
             WHEN XC.PERMUTA IN ('02') THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('03') THEN 'Ação Judicial(Jurídico)'
             WHEN XC.PERMUTA IN ('04') THEN 'Pedido de Distrato'
             WHEN XC.PERMUTA IN ('05') THEN 'Em Negociação'
             WHEN XC.PERMUTA IN ('06') THEN 'Ação Judicial(Distrato Inadimplente)'
             WHEN XC.PERMUTA IN ('07') THEN 'Venda com Permura'
             WHEN   datediff(day,p.DATAVENC,gETDATE()) >= 15 THEN 'Inadimplente'
    ELSE 'Adimplente' END 'Situacao Contrato'  
    from contrato xc
    inner join contratoParcela p on p.cod_contrato=xc.cod_contrato
    
    

     Usar função de janela com group by é bem chato,  uma alternativa é fazer um subsql no case conforme abaixo

    select 
    xc.cod_contrato,
    xc.permuta,
    p.datavenc as Vencimento
    ,CASE    WHEN isnull(XC.PERMUTA,'00')='00' AND 
             datediff(day, (select min(sub.DATAVENC) from contratoParcela sub where sub.cod_contrato= XC.COD_CONTRATO), GETDATE()) >= 15 THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('01') THEN 'Permuta' 
             WHEN XC.PERMUTA IN ('02') THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('03') THEN 'Ação Judicial(Jurídico)'
             WHEN XC.PERMUTA IN ('04') THEN 'Pedido de Distrato'
             WHEN XC.PERMUTA IN ('05') THEN 'Em Negociação'
             WHEN XC.PERMUTA IN ('06') THEN 'Ação Judicial(Distrato Inadimplente)'
             WHEN XC.PERMUTA IN ('07') THEN 'Venda com Permura'
             WHEN   datediff(day,p.DATAVENC,gETDATE()) >= 15 THEN 'Inadimplente'
    ELSE 'Adimplente' END 'Situacao Contrato'  
    from contrato xc
    inner join contratoParcela p on p.cod_contrato=xc.cod_contrato



    quinta-feira, 4 de julho de 2019 17:02

Todas as Respostas

  • Ronnie Von,

    Para que o Case possa analisar e atender as suas necessidades, aplique as regras como condições, inclusive este caso acredito que você terá que adicionar estas condições para que o Case possa aplicar a análise de forma correta.

    Outra cois, como você esta utilizando em cada condição um valor fixo, já comentei isso, não uso o operador IN, use diretamente o sinal de Igual.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 4 de julho de 2019 15:15
  • Boa Tarde!

    Coloquei na condição e não esta trazendo.

    SELECT 
    Convert(varchar(10), DATAREFERENCIA,103) AS DATA
           ,CONVERT (VARCHAR(10), DATAVENC,103)  AS 'Dt Vencimento'
          ,case when [DATABAIXA] IS NULL and DATEDIFF(DAY, GETDATE(),[DATAVENC]) <= 0
            then '1'
            else 0
             end as [Parcela Vencido]
              ,XC.PERMUTA
              ,ISNULL (XC.PERMUTA ,0)AS Codigo
            , CASE WHEN XC.PERMUTA = ('01') THEN 'Permuta' 
             WHEN XC.PERMUTA = ('02') THEN 'Inadimplente'
             WHEN XC.PERMUTA = ('03') THEN 'Ação Judicial(Jurídico)'
             WHEN XC.PERMUTA = ('04') THEN 'Pedido de Distrato'
             WHEN XC.PERMUTA = ('05') THEN 'Em Negociação'
             WHEN XC.PERMUTA = ('06') THEN 'Ação Judicial(Distrato Inadimplente)'
             WHEN XC.PERMUTA = ('07') THEN 'Venda com Permura'
             WHEN MIN(datediff(day,DATAVENC,gETDATE())) >= 1 THEN 'Inadimplente'
               
             WHEN ISNULL (XC.PERMUTA ,0)= '0'  AND MIN (datediff(day, DATAVENC,GETDATE())) >= 1 THEN 'Inadimplente2'
    ELSE 'Adimplente' END 'Situacao Contrato',  
            ISNULL (DATEDIFF (DAY,DATAVENC , GETDATE()+1),0) AS 'Dias_Abertura'
         
      FROM [BI].[dbo].[Financeiro.ParcelasIncorporacao] AS PARC
         INNER JOIN SRVBD.CORPORERM.DBO.XVENDA      AS X  (NOLOCK)
          ON  /*X.CODCOLIGADA = [Financeiro.ParcelasIncorporacao].CODCOLIGADA AND*/ X.NUM_VENDA =  PARC.NUMVENDA
        INNER JOIN SRVBD.CORPORERM.DBO.XVENDACOMPL AS XC (NOLOCK) 
          ON XC.NUMVENDA  = X.NUM_VENDA  
        
    WHERE Convert(varchar(10), DATAREFERENCIA,103)= CONVERT(VARCHAR(10),GETDATE(), 103)
    AND PARC.NUMVENDA IN ('1006')
     AND [DATABAIXA] IS NULL
     
     GROUP BY 
     Convert(varchar(10), DATAREFERENCIA,103)
     ,DATAVENC
     ,DATABAIXA
     ,PERMUTA
     
     order by DATAVENC

    quinta-feira, 4 de julho de 2019 16:26
  • Deleted
    quinta-feira, 4 de julho de 2019 16:49
  • Você esta listando vários contratos?

     Para pegar a menor data de um contrato especifico você pode usar uma função de janela chamava FIRST_VALUE.

     De uma olhada no código abaixo que fiz antes de você colocar seu SQL inteiro

    create table Contrato
    (
    cod_contrato int,
    PERMUTA  char(2)
    );
    insert into Contrato(cod_contrato, PERMUTA) VALUES (1, '00');
    insert into Contrato(cod_contrato, PERMUTA) VALUES (2, '00');
    
    create table ContratoParcela
    (
     cod_contrato int,
     dataVenc date,
    );
    
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2018-12-05');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2018-12-18');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-06-18');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-07-18');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-07-20');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (1, '2019-07-30');
    
    INSERT INTO ContratoParcela(cod_contrato, dataVenc) VALUES (2, '2019-07-20');
    INSERT INTO ContratoParcela(cod_contrato,dataVenc) VALUES (2, '2019-07-30');
    
    
    select 
    xc.cod_contrato,
    xc.permuta,
    p.datavenc as Vencimento
    ,CASE    WHEN isnull(XC.PERMUTA,'00')='00' AND 
             datediff(day, FIRST_VALUE(P.DATAVENC) OVER (PARTITION BY XC.COD_CONTRATO ORDER BY P.DATAVENC), GETDATE()) >= 15 THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('01') THEN 'Permuta' 
             WHEN XC.PERMUTA IN ('02') THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('03') THEN 'Ação Judicial(Jurídico)'
             WHEN XC.PERMUTA IN ('04') THEN 'Pedido de Distrato'
             WHEN XC.PERMUTA IN ('05') THEN 'Em Negociação'
             WHEN XC.PERMUTA IN ('06') THEN 'Ação Judicial(Distrato Inadimplente)'
             WHEN XC.PERMUTA IN ('07') THEN 'Venda com Permura'
             WHEN   datediff(day,p.DATAVENC,gETDATE()) >= 15 THEN 'Inadimplente'
    ELSE 'Adimplente' END 'Situacao Contrato'  
    from contrato xc
    inner join contratoParcela p on p.cod_contrato=xc.cod_contrato
    
    

     Usar função de janela com group by é bem chato,  uma alternativa é fazer um subsql no case conforme abaixo

    select 
    xc.cod_contrato,
    xc.permuta,
    p.datavenc as Vencimento
    ,CASE    WHEN isnull(XC.PERMUTA,'00')='00' AND 
             datediff(day, (select min(sub.DATAVENC) from contratoParcela sub where sub.cod_contrato= XC.COD_CONTRATO), GETDATE()) >= 15 THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('01') THEN 'Permuta' 
             WHEN XC.PERMUTA IN ('02') THEN 'Inadimplente'
             WHEN XC.PERMUTA IN ('03') THEN 'Ação Judicial(Jurídico)'
             WHEN XC.PERMUTA IN ('04') THEN 'Pedido de Distrato'
             WHEN XC.PERMUTA IN ('05') THEN 'Em Negociação'
             WHEN XC.PERMUTA IN ('06') THEN 'Ação Judicial(Distrato Inadimplente)'
             WHEN XC.PERMUTA IN ('07') THEN 'Venda com Permura'
             WHEN   datediff(day,p.DATAVENC,gETDATE()) >= 15 THEN 'Inadimplente'
    ELSE 'Adimplente' END 'Situacao Contrato'  
    from contrato xc
    inner join contratoParcela p on p.cod_contrato=xc.cod_contrato



    quinta-feira, 4 de julho de 2019 17:02