Usuário com melhor resposta
Status data vencimento

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.
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
- Editado Levi Jr quinta-feira, 4 de julho de 2019 17:06
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 4 de julho de 2019 19:15
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]
-
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 -
-
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
- Editado Levi Jr quinta-feira, 4 de julho de 2019 17:06
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 4 de julho de 2019 19:15