Dúvidas CASE WHEN
05/02/2014
0
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
Marcio Morando
Posts
07/02/2014
Fabiano Carvalho
mas acho que deve ficar
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.
07/02/2014
Marisiana Battistella
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
07/02/2014
Alex Lekao
Mas eh bom saber!!!!
vivendo aprendendo... rsrs
07/02/2014
Marcio Morando
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.
07/02/2014
Marisiana Battistella
Dessa forma fica fácil se precisar acrescentar colunas e buscar dados de mais tabelas.
Já utilizei essa lógica em uma rotina de 500 linhas e não tive problemas! =)
O maior segredo pra ter boa performance é criar o JOINs corretamente e fazer o uso dos índices (quando existirem) .
Clique aqui para fazer login e interagir na Comunidade :)