select dentro do case ou if
03/02/2016
0
Preciso fazer uma seleção condicional em duas tabelas, por exemplo:
Se em uma tabela eu tiver o campo pfcompl.status = '05' então eu quero selecionar o campo pfcompl.xcodigo
porém se esse campo for diferente de '05' então eu selecionaria o campo pfunc.codigo.
Eu gostaria que fosse um select dentro de um case pq vou utilizar os campos condicionais no where.
Marcelo Manzini
Posts
04/02/2016
Claudio Lopes
Poderia colocar a sua query para analise? Mas tentando te ajudar....
nao seria melhor você colocar um case when em sua consulta tipof
select .... case when pfcompl.status = '05' then campo pfunc.codigo from .....
lembrando que você também pode usar essa lógica no where, mas por questões de boas práticas, performance... poste o código.
04/02/2016
Alex Lekao
honestamente nao consegui entender bem.
no sql eh possivel usar um if, onde faz um tratamento de uma variavel e se o resultado for verdadeiro ele executa um select e se for falso ele executa um outro select.
eu utilizo esse if aqui em uma consulta minha por uma questao muito especifica que nao consegui contemplar com o case.
04/02/2016
Marcelo Manzini
SELECT PFUNC.CHAPA, PFCOMPL.STATUSVAGA
CASE WHEN PFCOMPL.STATUSVAGA ='05' THEN
(SELECT PFCOMPL.YCODSECAO, PFCOMPL.XCODFUNCAO
FROM PFCOMPL
WHERE PFCOMPL.CHAPA = PFUNC.CHAPA)
ELSE
(SELECT PFUNC.CODSECAO, PFUNC.CODFUNCAO
FROM PFUNC
WHERE PFCOMPL.CHAPA = PFUNC.CHAPA)
END
FROM PFUNC, PFCOMPL
WHERE PFUNC.CHAPA = PFCOMPL.CHAPA
05/02/2016
Alex Lekao
esse seu select retornou algum erro?
So uma dica para ajudar nas leituras dos codigos qdo postar utilize a tag inserir codigo(</>).
talvez vc tera que usar algum group by dentro dos selects e tal.
05/02/2016
Claudio Lopes
SELECT PFUNC.CHAPA, PFCOMPL.STATUSVAGA CASE WHEN PFCOMPL.STATUSVAGA ='05' THEN (SELECT PFCOMPL.YCODSECAO, PFCOMPL.XCODFUNCAO FROM PFCOMPL WHERE PFCOMPL.CHAPA = PFUNC.CHAPA) ELSE (SELECT PFUNC.CODSECAO, PFUNC.CODFUNCAO FROM PFUNC WHERE PFCOMPL.CHAPA = PFUNC.CHAPA ) END FROM PFUNC, PFCOMPL WHERE PFUNC.CHAPA = PFCOMPL.CHAPA
Voce está utilizando sub query's porém essa sub query tem que retornar 1 linha e 1 coluna. Caso tentasse executa-la iria dar erro como esse
Montando sua query eu faria assim:
SELECT PFUNC.CHAPA, PFCOMPL.STATUSVAGA, -- EXEMPLO COM IIF IIF(PFCOMPL.STATUSVAGA = '05', PFCOMPL.YCODSECAO,PFUNC.CODSECAO) AS 'CODSECAO' -- EXEMPO COM CASE CASE WHEN PFCOMPL.STATUSVAGA = '05' THEN PFCOMPL.XCODFUNCAO ELSE PFUNC.CODFUNCAO END AS 'CODFUNCAO' FROM PFUNC WITH(NOLOCK), PFCOMPL WITH(NOLOCK) WHERE PFUNC.CHAPA = PFCOMPL.CHAPA
Qualquer dúvida posta ai
19/02/2016
Helder
Não sei se já conhecem, mas existe uma plataforma para criação de webservices muito eficiente, basta apenas liberar acesso para o banco de dados, e você pode criar uma nova tabela, um novo campo com apenas um clique, talvez ajude muito vocês.
Fica a indicação do Datasocket.
datasocket.co/free
18/03/2021
Jacqueline
,case when m.ArquivoOrdemMov=''OC''then ''Preço''
/*(select ci.CustoOCItem from OCItem ci join OC c on c.SeqOC=ci.SeqOC)* -> e não sei se esta certo/
from Mov m
join MovFisica f on m.SeqMovFisica=f.SeqMovFisica
join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC
join Produto p on m.SeqProduto=p.SeqProduto
where m.ArquivoOrdemMov=''OC'' and c.SituacaoOC=''FECHADA''
18/03/2021
Emerson Nascimento
porque o erro não está na select. está na própria case.
select m.ArquivoOrdemMov, m.ContadorAgenteMov, m.DataMov, m.SeqOrdemMov, m.SeqProduto, m.SaldoTotalMov, p.DescricaoProduto, case when m.ArquivoOrdemMov='OC' then 'Preço' else (select ci.CustoOCItem from OCItem ci where ci.SeqOC = c.SeqOC) -- a relação é somente por um campo? end -- os resultados do THEN e do ELSE precisam ser do mesmo tipo from Mov m join MovFisica f on m.SeqMovFisica=f.SeqMovFisica join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC join Produto p on m.SeqProduto=p.SeqProduto where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA'
sugestão:
select m.ArquivoOrdemMov, m.ContadorAgenteMov, m.DataMov, m.SeqOrdemMov, m.SeqProduto, m.SaldoTotalMov, p.DescricaoProduto, case when m.ArquivoOrdemMov='OC' then 'Preço' else ci.CustoOCItem end /* os resultados do THEN e do ELSE precisam ser do mesmo tipo */ from Mov m join MovFisica f on m.SeqMovFisica=f.SeqMovFisica join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC join Produto p on m.SeqProduto=p.SeqProduto left join OCItem ci on ci.SeqOC = c.SeqOC -- não falta mais algum campo pra relacionar? where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA'
20/08/2021
Jacqueline
Agradeço a ajuda, mas vi que a minha dúvida não se tratava somente disso, como ia precisar fazer 2 union's precisei fazer mais algumas coisas, segue o que foi feito e deu certo para que resolvesse o meu problema, segue o que fiz:
select m.ArquivoOrdemMov as Movimento, m.ContadorAgenteMov as Contador, m.DataMov as Data_da_Movimentacao, p.CodigoProduto as Codigo, p.DescricaoProduto as Descricao, m.QtdOperacaoFisicaMov as Quantidade, FORMAT (ci.CustoOCItem,'0.000') as Preco_Compra,/*o problema era a partir daqui, como tinha mais 2 tabelas sem ter o preço tive que usar o format nessas 3 colunas*/ FORMAT (ep.ValorCustoEstoquePro,'0.000') as Preco_Custo, FORMAT (ep.ValorCompraEstoquePro,'0.000') as Preco_Cadastrado ,te.DescricaoTbEstoque as Estoque from Mov m join MovFisica f on m.SeqMovFisica=f.SeqMovFisica join Produto p on m.SeqProduto=p.SeqProduto join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC join OCItem ci on (m.SeqProduto=ci.SeqProduto and m.SeqOrdemItemMov=ci.SeqOCItem) join EstoquePro ep on (m.SeqTbEstoque=ep.SeqTbEstoque and m.SeqProduto=ep.SeqProduto) join TbEstoque te on m.SeqTbEstoque=te.SeqTbEstoque where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA'
20/08/2021
Jacqueline
Clique aqui para fazer login e interagir na Comunidade :)