select dentro do case ou if
Pessoal não manjo muito de sql e gostaria de uma ajuda para montar uma consulta.
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.
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
Curtidas 0
Respostas
Claudio Lopes
03/02/2016
Marcelo,
Poderia colocar a sua query para analise? Mas tentando te ajudar....
nao seria melhor você colocar um case when em sua consulta tipof
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.
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.
GOSTEI 0
Alex Lekao
03/02/2016
acho q seria interessante detalhar melhor para tentarmos ajudar melhor.
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.
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.
GOSTEI 0
Marcelo Manzini
03/02/2016
Tentei colocar abaixo mais ou menos o que eu preciso, provavelmente a composição está errada, mas talvez o sentido esteja certo, se der para entender o sentido e indicar as correções talvez eu consiga resolver o problema:
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
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
GOSTEI 0
Alex Lekao
03/02/2016
ola, bom dia!!!
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.
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.
GOSTEI 0
Claudio Lopes
03/02/2016
Marcelo... sua query está assim
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:
Qualquer dúvida posta ai
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
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
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
GOSTEI 0
Helder
03/02/2016
Olá pessoal, tudo bem?
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
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
GOSTEI 0
Jacqueline
03/02/2016
Olá pessoal, sou nova por aqui preciso saber se é possível fazer um select join dentro de um case se for por favor me informe onde esta o erro senão o que pode ser feito, segue o comando que preciso executar:
,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''
select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
,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''
GOSTEI 0
Emerson Nascimento
03/02/2016
do que exatamente você precisa?
porque o erro não está na select. está na própria case.
sugestão:
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'
GOSTEI 0
Jacqueline
03/02/2016
Olá Pessoal,
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:
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'
GOSTEI 0
Jacqueline
03/02/2016
Retificando era mais 2 colunas e não tabela como postei no comentários,
GOSTEI 0