Array
(
)

Dúvidas CASE WHEN

Marcio Morando
   - 05 fev 2014

Boa Tarde,
Estou utilizado o CASE WHEN em um SELECT. No Terceiro Case preciso que traga tudo que seja diferente de 'OND'.
Tentei fazer refugoOP.Maquina <> 'OND' , mas não funciona. Como devo proceder?
CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END AS QTD_OND,
CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END AS PESO_OND,
CASE refugoOP.Maquina WHEN ' ' THEN SUM(refugoOP.Quantidade) END AS QTD_CONV

Alex Lekao
   - 05 fev 2014

oi Marcio, boa tarde!!!

nao sei se entendi bem.

vc quer no calculo somar tudo que seja o restante eh isso?

por exemplo se for 1 some tal coisa, se for 2 some tal coisa, se for 3 some tal coisa senao some tal coisa?

se for assim vc usa o sum no else para ver se da o resultado que vc quer, que ele vai filtrar tudo o que vc colocou no case e o que for fora ele soma no else.

testa e diz ae se funcionou ou nao.

Marcio Morando
   - 05 fev 2014

Boa Tarde Amigo,

Não Não, queria que no terceiro case ele somasse tudo que não fosse 'OND'.

Mas já consegui resolver. Mesmo assim obrigado pela atenção.

Até mais!

Alex Lekao
   - 05 fev 2014

BLZ.

Qqr coisa estamos ai.

Faabiianooc
   - 05 fev 2014

Prefira não colocar tudo isso de case..utilize apenas.
SELECT
CASE COLUNA
WHEN VALOR = 1 THEN 1
WHEN VALOR = 2 THEN 2
ELSE 3 END
FROM TABELA

Marcio Morando
   - 05 fev 2014

Beleza Fabiano, deixei como você indicou. Interfere muita coisa na Performance da consulta deixando como estava antes?

Muito Obrigado pela ajuda.

Marcio Morando
   - 06 fev 2014

Bom Dia Galera,

Estou fazendo desta maneira, mas quando o registro tem por exemplo as tres opcoes abaixo, está me trazendo duas vezes a mesma coisa, como faço para me trazer somente um registro?

CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END AS QTD_OND,
CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END AS PESO_OND,
CASE refugoOP.Maquina WHEN ' ' THEN SUM(refugoOP.Quantidade) END AS QTD_CONV

Faabiianooc
   - 06 fev 2014

Questão de desempenho não sei lhe informar
Sobre a outra duvida,voce pode usar in no case ou utilizar a primeira dica que lhe dei,

Fabiano

Marcio Morando
   - 06 fev 2014

Como fica a sintaxe do CASE com IN?

Alex Lekao
   - 06 fev 2014

nunca usei in no CASE...

mas acho que deve ficar

#Código

CASE WHEN CAMPO IN ('1','10') THEN CAMPO ELSE CAMPO END

Faabiianooc
   - 07 fev 2014


Citação:
nunca usei in no CASE...

mas acho que deve ficar

#Código

CASE WHEN CAMPO IN ('1','10') THEN CAMPO ELSE CAMPO END


Exatamente.
Pode usar like, subselect, e tudo mais.

Marisiana
   - 07 fev 2014

Estou utilizado o CASE WHEN em um SELECT. No Terceiro Case preciso que traga tudo que seja diferente de 'OND'.
Tentei fazer refugoOP.Maquina <> 'OND' , mas não funciona. Como devo proceder?

CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END AS QTD_OND,
CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END AS PESO_OND,
CASE refugoOP.Maquina WHEN ' ' THEN SUM(refugoOP.Quantidade) END AS QTD_CONV

Bom dia!

De acordo com a pergunta inicial, você teria que criar o seguinte SQL:

select CASE
WHEN refugoOP.Maquina = 'OND' THEN
SUM(refugoOP.quantidade)
END as qtd_ond,
CASE
WHEN refugoOP.Maquina = 'OND' THEN
SUM(refugoOP.quantidade)
END as peso_ond,
CASE
WHEN refugoOP.Maquina NOT IN ('OND') THEN
SUM(refugoOP.quantidade)
END as qtd_conv
from refugoOP
group by refugoOP.Maquina

No terceiro CASE pode utilizar NOT IN ou <> que vai funcionar...
Acredito que não afeta em nada a performance utilizando os 3 CASE, o que mais afeta a performance são os JOINs mal definidos (na maioria das vezes a falta deles) e o
Mas pelo q entendi no exemplo q, passastes, vc está utilizando apenas uma tabela, então não teria problema nenhum..

A dica que o Fabiano passou em utilizar apenas um CASE não é errada....
Mas no teu caso, pelo que entendi, vc precisa que retorne 3 colunas com nomes diferentes então vc precisa utilizar CASES separados...

Marisiana
   - 07 fev 2014


Citação:
Estou utilizado o CASE WHEN em um SELECT. No Terceiro Case preciso que traga tudo que seja diferente de 'OND'.
Tentei fazer refugoOP.Maquina <> 'OND' , mas não funciona. Como devo proceder?

CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END AS QTD_OND,
CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END AS PESO_OND,
CASE refugoOP.Maquina WHEN ' ' THEN SUM(refugoOP.Quantidade) END AS QTD_CONV



Bom dia!

De acordo com a pergunta inicial, você teria que criar o seguinte SQL:

select CASE
WHEN refugoOP.Maquina = 'OND' THEN
SUM(refugoOP.quantidade)
END as qtd_ond,
CASE
WHEN refugoOP.Maquina = 'OND' THEN
SUM(refugoOP.quantidade)
END as peso_ond,
CASE
WHEN refugoOP.Maquina NOT IN ('OND') THEN
SUM(refugoOP.quantidade)
END as qtd_conv
from refugoOP
group by refugoOP.Maquina

No terceiro CASE pode utilizar NOT IN ou <> que vai funcionar...
Acredito que não afeta em nada a performance utilizando os 3 CASE, o que mais afeta a performance são os JOINs mal definidos (na maioria das vezes a falta deles) e o
Mas pelo q entendi no exemplo q, passastes, vc está utilizando apenas uma tabela, então não teria problema nenhum..

A dica que o Fabiano passou em utilizar apenas um CASE não é errada....
Mas no teu caso, pelo que entendi, vc precisa que retorne 3 colunas com nomes diferentes então vc precisa utilizar CASES separados...

Alex Lekao
   - 07 fev 2014


Citação:

Citação:
nunca usei in no CASE...

mas acho que deve ficar

#Código

CASE WHEN CAMPO IN ('1','10') THEN CAMPO ELSE CAMPO END


Exatamente.
Pode usar like, subselect, e tudo mais.

Honestamente eu nao sabia... mais uma que aprendi..

Ow... Vc nao mandou a parada para mim eim. rsrs

Alex Lekao
   - 07 fev 2014

Particularmente eu usaria um subselect para cada situacao especifica que acho que o resultado seria melhor e vc conseguiria fazer algum outro tipo de tratamento melhor no select.

E com relacao ao desempenho acredito que o peso seja igual.

Eu usava case para algumas situacoes parecidas com essa sua necessidade aqui na empresa, mas acabei mudando para uma sibselect justamente pelos motivos que mencionei.

Abraco.

Faabiianooc
   - 07 fev 2014


Citação:

Citação:

Citação:
nunca usei in no CASE...

mas acho que deve ficar

#Código

CASE WHEN CAMPO IN ('1','10') THEN CAMPO ELSE CAMPO END


Exatamente.
Pode usar like, subselect, e tudo mais.

Honestamente eu nao sabia... mais uma que aprendi..

Ow... Vc nao mandou a parada para mim eim. rsrs
Até segunda-feira eu mando, estou sem tempo pra atualiza-lo rsrs.
Mas eu mando

Alex Lekao
   - 07 fev 2014

Blz Fabiano...

To no aguardo!!.. rsrsr

Faabiianooc
   - 07 fev 2014


Citação:

Citação:

Citação:
nunca usei in no CASE...

mas acho que deve ficar

#Código

CASE WHEN CAMPO IN ('1','10') THEN CAMPO ELSE CAMPO END


Exatamente.
Pode usar like, subselect, e tudo mais.

Honestamente eu nao sabia... mais uma que aprendi..

Ow... Vc nao mandou a parada para mim eim. rsrs

da pra colocar dentro de um sum,count..

exemplo

SELECT SUM(CASE WHEN GETDATE() < '2014-03-01 00:00' THEN 1 END)

Ira somar tudo que estiver menor que a data informada..

Caso nao saiba, count(coluna) só conta valores não nulos e count(*) conta tudo, o mesmo vale para funcoes de agrupamento.

Marisiana
   - 07 fev 2014


Citação:
Particularmente eu usaria um subselect para cada situacao especifica que acho que o resultado seria melhor e vc conseguiria fazer algum outro tipo de tratamento melhor no select.

E com relacao ao desempenho acredito que o peso seja igual.

Eu usava case para algumas situacoes parecidas com essa sua necessidade aqui na empresa, mas acabei mudando para uma sibselect justamente pelos motivos que mencionei.

Abraco.


As duas situações podem ser consideradas!
Acredito, que tudo depende do tipo de retorno que é preciso ter e da regra de negócio ou estudo de caso que está sendo tratado.
Apresentei a situação acima, pois ele só utiliza uma tabela no SQL que ele apresentou.
Já criei rotinas mais complexas utilizando o CASE e tratando bem os JOINs, mas foi no Oracle, não sei se pra SQL Server é igual...

Att

Alex Lekao
   - 07 fev 2014

Essa particularidade do Case nao sabia... nao tinha nem ideia... tbm nunca tentei... srsr

Mas eh bom saber!!!!

vivendo aprendendo... rsrs

Marcio Morando
   - 07 fev 2014


Citação:

Citação:
Estou utilizado o CASE WHEN em um SELECT. No Terceiro Case preciso que traga tudo que seja diferente de 'OND'.
Tentei fazer refugoOP.Maquina <> 'OND' , mas não funciona. Como devo proceder?

CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END AS QTD_OND,
CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END AS PESO_OND,
CASE refugoOP.Maquina WHEN ' ' THEN SUM(refugoOP.Quantidade) END AS QTD_CONV



Bom dia!

De acordo com a pergunta inicial, você teria que criar o seguinte SQL:

select CASE
WHEN refugoOP.Maquina = 'OND' THEN
SUM(refugoOP.quantidade)
END as qtd_ond,
CASE
WHEN refugoOP.Maquina = 'OND' THEN
SUM(refugoOP.quantidade)
END as peso_ond,
CASE
WHEN refugoOP.Maquina NOT IN ('OND') THEN
SUM(refugoOP.quantidade)
END as qtd_conv
from refugoOP
group by refugoOP.Maquina

No terceiro CASE pode utilizar NOT IN ou <> que vai funcionar...
Acredito que não afeta em nada a performance utilizando os 3 CASE, o que mais afeta a performance são os JOINs mal definidos (na maioria das vezes a falta deles) e o
Mas pelo q entendi no exemplo q, passastes, vc está utilizando apenas uma tabela, então não teria problema nenhum..

A dica que o Fabiano passou em utilizar apenas um CASE não é errada....
Mas no teu caso, pelo que entendi, vc precisa que retorne 3 colunas com nomes diferentes então vc precisa utilizar CASES separados...



É isso ai mesmo Mari. Preciso que me retorne 3 colunas diferentes. Muito Obrigado.