Jump to content
Daniel Oliveira

Where para case SQL sever

Recommended Posts

Boa tarde,

Tenho uma consulta e estou tendo uma certa dificuldade para colocar a condição where para o (select case ..

vou colocar a consulta e o where que pensei para colocar junto com o case

segue a mesma:

SELECT FCFO.NOME,
FLAN.DATAVENCIMENTO,
FLAN.DATABAIXA,
(SELECT CASE
WHEN FLAN.DATABAIXA IS NOT NULL
AND FLAN.DATABAIXA >= '03/21/2016'
AND FLAN.CODAPLICACAO = 'S'
AND FLAN.VALORBAIXADO <> '0.00'
AND FLAN.CODCXA IN( '01', '02', '03', '07' ) THEN FLAN.VALORBAIXADO + 1.52
WHEN FLAN.DATABAIXA IS NOT NULL
AND FLAN.DATABAIXA >= '03/21/2016'
AND FLAN.CODAPLICACAO = 'S'
AND FLAN.VALORBAIXADO <> '0.00'
AND FLAN.CODCXA = '05' THEN FLAN.VALORBAIXADO + 1.81
ELSE FLAN.VALORBAIXADO
END) AS 'VALOR PAGO',
FLAN.CNABNOSSONUMERO AS 'NOSSO NUMERO',
'109' AS CARTEIRA,
FLAN.CODTDO,
FLAN.HISTORICO,
FLAN.IDBOLETO,
CASE FLAN.STATUSLAN
WHEN 0 THEN 'EM ABERTO'
WHEN 1 THEN 'BAIXADO'
WHEN 2 THEN 'CANCELADO'
WHEN 3 THEN 'BAIXADO POR ACORDO'
WHEN 4 THEN 'BAIXADO PARCIALMENTE'
WHEN 5 THEN 'BORDERO'
END AS STATUS,
( CASE
WHEN FLAN.CODCXA = '01' THEN '10378-8 (Itaú)'
WHEN FLAN.CODCXA = '02' THEN '08771-8 (Itaú CT)'
WHEN FLAN.CODCXA = '03' THEN '15400-0 (Itaú ICTQ)'
WHEN FLAN.CODCXA = '04' THEN 'DINHEIRO'
WHEN FLAN.CODCXA = '05' THEN '27837-4 (Itaú Cursos)'
WHEN FLAN.CODCXA = '07' THEN '34200-6'
WHEN FLAN.CODCXA = '08' THEN '580266-3 (Safra CT)'
WHEN FLAN.CODCXA = '09' THEN '580283-3 (Safra ICTQ)'
WHEN FLAN.CODCXA = '10' THEN '580284-1 (Safra Cursos)'
WHEN FLAN.CODCXA = '11' THEN 'PAG SEGURO'
END ) AS 'CONTA/CAIXA',
GCCUSTO.NOME AS 'CENTRO DE CUSTO'
FROM FLAN
INNER JOIN GCCUSTO
ON FLAN.CODCOLIGADA = GCCUSTO.CODCOLIGADA
AND FLAN.CODCCUSTO = GCCUSTO.CODCCUSTO
LEFT JOIN FCFO
ON FCFO.CODCOLIGADA = FLAN.CODCOLIGADA
AND FCFO.CODCFO = FLAN.CODCFO
WHERE DATAVENCIMENTO BETWEEN :VENCIMENTO_INICIAL AND :VENCIMENTO_FINAL
AND FLAN.PAGREC = 1
AND GCCUSTO.NOME LIKE :CIDADE
AND DATABAIXA BETWEEN :BAIXA_INICIAL AND :BAIXA_FINAL
AND FLAN.VALORBAIXADO <> 0
AND CODTDO IN ('BOL','BOLETOPS','REND','TRANSBANC','CARTCRED')
AND STATUSLAN = 1

Estou querendo colocar a condição dentro do select case, como a condição de que a partir da data: X o valores de calculo muda para mais: segue a parte que gostaria de coloca como condição que eu estou com dificuldade:

WHERE CASE
WHEN FLAN.DATABAIXA IS NOT NULL
AND FLAN.DATABAIXA >= '02/08/2021'
AND FLAN.CODAPLICACAO = 'S'
AND FLAN.VALORBAIXADO <> '0.00'
AND FLAN.CODCXA IN( '01', '03', '07' ) THEN FLAN.VALORBAIXADO + 1.54
WHEN FLAN.DATABAIXA IS NOT NULL
AND FLAN.DATABAIXA >= '02/09/2021'
AND FLAN.CODAPLICACAO = 'S'
AND FLAN.VALORBAIXADO <> '0.00'
AND FLAN.CODCXA = '02' THEN FLAN.VALORBAIXADO + 1.45
WHEN FLAN.DATABAIXA IS NOT NULL
AND FLAN.DATABAIXA >= '02/08/2021'
AND FLAN.CODAPLICACAO = 'S'
AND FLAN.VALORBAIXADO <> '0.00'
AND FLAN.CODCXA = '05' THEN FLAN.VALORBAIXADO + 1.84
ELSE FLAN.VALORBAIXADO

Poderia me da uma ajuda ?

Share this post


Link to post
Share on other sites

Bom dia Luis, 

estou tentando filtra pela data baixada e preciso colocar uma condição porque a partir  desse mesmo os valores a serem calculado para os boleto uns aumentaram e um abaixo, a syntax logo abaixa é a que temo hoje e usamos ela no CUBO. 

(SELECT CASE
WHEN FLAN.DATABAIXA IS NOT NULL
AND FLAN.DATABAIXA >= '03/21/2016'
AND FLAN.CODAPLICACAO = 'S'
AND FLAN.VALORBAIXADO <> '0.00'
AND FLAN.CODCXA IN( '01', '02', '03', '07' ) THEN FLAN.VALORBAIXADO + 1.52
WHEN FLAN.DATABAIXA IS NOT NULL
AND FLAN.DATABAIXA >= '03/21/2016'
AND FLAN.CODAPLICACAO = 'S'
AND FLAN.VALORBAIXADO <> '0.00'
AND FLAN.CODCXA = '05' THEN FLAN.VALORBAIXADO + 1.81
ELSE FLAN.VALORBAIXADO
END) AS 'VALOR PAGO',

só que eu preciso que essa consulta faça também esses mesmo cálculos com a syntax logo abaixo: 

WHERE CASE 
                WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/08/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA IN( '01', '03', '07' ) THEN FLAN.VALORBAIXADO + 1.54
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/09/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA = '02' THEN FLAN.VALORBAIXADO + 1.45
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/08/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA = '05' THEN FLAN.VALORBAIXADO + 1.84

 

O banco que estou estou usando é o MSSQLServer, desde já agradeço se poder me ajudar ! 

 

 

 

Share this post


Link to post
Share on other sites

@Daniel Oliveira, boa tarde!

Na cláusula where o teste tem que ser uma condição booleana, por exemplo: 

 

SELECT * 
FROM GCOLIGADA 
WHERE CODCOLIGADA = ( CASE WHEN 1=1 THEN 1 ELSE 0 END ) 

Nesse exemplo, o case irá retornar um valor que você pode testar... com os operadores de comparação e/ou lógicos... 

logo, faz esse teste aqui...

 

WHERE FLAN.VALORBAIXADO = CASE 
                WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/08/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA IN( '01', '03', '07' ) THEN FLAN.VALORBAIXADO + 1.54
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/09/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA = '02' THEN FLAN.VALORBAIXADO + 1.45
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/08/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA = '05' THEN FLAN.VALORBAIXADO + 1.84

 

Mas como concelho, acredito que uma CTE e/ou CROSS APPLY ira lhe atender melhor.

 

abraços.

Share this post


Link to post
Share on other sites

@luisgustavogomes boa tarde, 

aparentemente ainda tá tendo algum erro que não consegui identificar, segue o print para tu chegar: 

216047229_cota0100.thumb.png.f09afdbed2db162457cec9b1c3633903.png

essa seria a maneira correta de colocar a where ? e se eu usar só a condição  when funcionaria também ? 

Share this post


Link to post
Share on other sites

Pessoal consegui fazer com que funcionasse corretamente, a consulta ficou da seguinte forma: 

SELECT FCFO.NOME,
       FLAN.DATAVENCIMENTO,
       FLAN.DATABAIXA,
       (SELECT CASE
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA <= '02/07/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA IN( '01', '02', '03', '07' ) THEN FLAN.VALORBAIXADO + 1.52
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/08/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA IN( '01', '03', '07' ) THEN FLAN.VALORBAIXADO + 1.54
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/09/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA = '02' THEN FLAN.VALORBAIXADO + 1.45
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA <= '02/07/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA = '05' THEN FLAN.VALORBAIXADO + 1.81
                 WHEN FLAN.DATABAIXA IS NOT NULL
                      AND FLAN.DATABAIXA >= '02/08/2021'
                      AND FLAN.CODAPLICACAO = 'S'
                      AND FLAN.VALORBAIXADO <> '0.00'
                      AND FLAN.CODCXA = '05' THEN FLAN.VALORBAIXADO + 1.84
                 ELSE FLAN.VALORBAIXADO
               END)         AS 'VALOR PAGO',
       FLAN.CNABNOSSONUMERO AS 'NOSSO NUMERO',
       '109'                AS CARTEIRA,
       FLAN.CODTDO,
       FLAN.HISTORICO,
       FLAN.IDBOLETO,
       CASE FLAN.STATUSLAN
         WHEN 0 THEN 'EM ABERTO'
         WHEN 1 THEN 'BAIXADO'
         WHEN 2 THEN 'CANCELADO'
         WHEN 3 THEN 'BAIXADO POR ACORDO'
         WHEN 4 THEN 'BAIXADO PARCIALMENTE'
         WHEN 5 THEN 'BORDERO'
       END                  AS STATUS,
       ( CASE
           WHEN FLAN.CODCXA = '01' THEN '10378-8 (Itaú)'
           WHEN FLAN.CODCXA = '02' THEN '08771-8 (Itaú CT)'
           WHEN FLAN.CODCXA = '03' THEN '15400-0 (Itaú ICTQ)'
           WHEN FLAN.CODCXA = '04' THEN 'DINHEIRO'
           WHEN FLAN.CODCXA = '05' THEN '27837-4 (Itaú Cursos)'
           WHEN FLAN.CODCXA = '07' THEN '34200-6'
           WHEN FLAN.CODCXA = '08' THEN '580266-3 (Safra CT)'
           WHEN FLAN.CODCXA = '09' THEN '580283-3 (Safra ICTQ)'
           WHEN FLAN.CODCXA = '10' THEN '580284-1 (Safra Cursos)'
           WHEN FLAN.CODCXA = '11' THEN 'PAG SEGURO'
         END )              AS 'CONTA/CAIXA',
       GCCUSTO.NOME         AS 'CENTRO DE CUSTO'
FROM   FLAN
       INNER JOIN GCCUSTO
               ON FLAN.CODCOLIGADA = GCCUSTO.CODCOLIGADA
                  AND FLAN.CODCCUSTO = GCCUSTO.CODCCUSTO
       LEFT JOIN FCFO
              ON FCFO.CODCOLIGADA = FLAN.CODCOLIGADA
                 AND FCFO.CODCFO = FLAN.CODCFO
WHERE  DATAVENCIMENTO BETWEEN :VENCIMENTO_INICIAL AND :VENCIMENTO_FINAL
       AND FLAN.PAGREC = 1
       AND GCCUSTO.NOME LIKE :CIDADE
       AND DATABAIXA BETWEEN :BAIXA_INICIAL AND :BAIXA_FINAL
       AND FLAN.VALORBAIXADO <> 0
       AND CODTDO IN ( 'BOL', 'BOLETOPS', 'REND', 'TRANSBANC', 'CARTCRED' )
       AND STATUSLAN = 1 

 

ao tentar fazer o WHERE, eu parti do pressuposto que daria certo fazer a condição pelo when e mudar o paramento de busca no >= ou <= assim delimita a consulta fazer a busca da forma que foi repassada a demanda, 

 

caso tenha uma forma melhor de se fazer, fico muito grato se me repassar o conhecimento, e deis de já agrade a ajuda @luisgustavogomes

 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.