Sou nova por aqui, pesquisei e não achei se é possível fazer um select case com condição, vou postar o código para mostrar o que preciso e vê se é possível, senão for me falem o que o que pode ser feito.
select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
,case when m.ArquivoOrdemMov='OC’then ‘Possui preço de compra’
/*dentro do then preciso fazer um select join para pegar um preço que esta em uma tabela que faz join com a tabela de compras(OC)
else 'Sem valor’end
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’
Obrigado Abel por responder.
Estou usando o sql do SQL Manager Studio.
Referente a fazer um left join não acho que isso é possível por que dentro do case m.ArquivoOrdemMov='OC’, se for diferente não terá o preço de custo e já estou fazendo um union, segue abaixo o comando que executo pegando 3 informações diferente:
select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
,case when m.ArquivoOrdemMov='OC’then ‘Possui preço de compra’
else 'Sem valor’end
from Mov m
join MovFisica f on m.SeqMovFisica=f.SeqMovFisica
join MS s on m.ContadorAgenteMov=s.ContadorAgenteMS
join Produto p on m.SeqProduto=p.SeqProduto
where m.ArquivoOrdemMov=‘MS’ and s.SituacaoMS=‘FECHADA’
union
select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
,case when m.ArquivoOrdemMov='OC’then ‘Possui preço de compra’
else 'Sem valor’end
from Mov m
join MovFisica f on m.SeqMovFisica=f.SeqMovFisica
join ME e on m.ContadorAgenteMov=e.ContadorAgenteME
join Produto p on m.SeqProduto=p.SeqProduto
where m.ArquivoOrdemMov=‘ME’ and e.SituacaoME='FECHADA
O que esta complicando é colocar o preço de custo que neste caso deve ser feito mais um join é aí que esta complicando.
O left join é para isso mesmo, para permitir ter valores com null e ainda assim aparecerem as linhas correspondentes
select m.ArquivoOrdemMov, m.ContadorAgenteMov, m.DataMov, m.SeqOrdemMov, m.SeqProduto, m.SaldoTotalMov, p.DescricaoProduto,
x.precoCompra -- não sei o nome exato da tua coluna, vai ter valor quando m.ArquivoOrdemMov = 'OC' e existir preço na tabela de compras
from Mov m
join MovFisica f on m.SeqMovFisica=f.SeqMovFisica
join MS s on m.ContadorAgenteMov=s.ContadorAgenteMS
join Produto p on m.SeqProduto=p.SeqProduto
left join OC x on x.produtoId = p.produtoId and m.ArquivoOrdemMov = 'OC' -- não sei se estes são os nomes da tua tabela e colunas de join
where m.ArquivoOrdemMov='MS' and s.SituacaoMS='FECHADA'
Obrigado por responder mas tem um ponto, se não tiver o case quando faz o union ele aparece o seguinte erro:
Msg 205, Level 16, State 1, Line 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
Devido que 2 consultas sem preço e uma vai ter uma coluna a mais, vou postar aqui o código inteiro:
–,case when m.ArquivoOrdemMov='OC’then ‘Possui preço de compra’
–else 'Sem valor’end
from Mov m
join MovFisica f on m.SeqMovFisica=f.SeqMovFisica
join MS s on m.ContadorAgenteMov=s.ContadorAgenteMS
join Produto p on m.SeqProduto=p.SeqProduto
where m.ArquivoOrdemMov=‘MS’ and s.SituacaoMS=‘FECHADA’
union
select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
–,case when m.ArquivoOrdemMov='OC’then ‘Possui preço de compra’
–else 'Sem valor’end
from Mov m
join MovFisica f on m.SeqMovFisica=f.SeqMovFisica
join ME e on m.ContadorAgenteMov=e.ContadorAgenteME
join Produto p on m.SeqProduto=p.SeqProduto
where m.ArquivoOrdemMov=‘ME’ and e.SituacaoME=‘FECHADA’
union
select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
–,ci.CustoOCItem
–,case when m.ArquivoOrdemMov='OC’then ‘Possui preço de compra’
–else 'Sem valor’end
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
join OCItem ci on c.SeqOC=ci.SeqOC
where m.ArquivoOrdemMov=‘OC’ and c.SituacaoOC=‘FECHADA’.
Das 3 queries somente uma vai ter preço as outras vai ter que ficar com a coluna ‘Sem preço’ por isso coloquei como dentro do case.
Quando o m.ArquivoOrdemMov =‘OC’ faz select para pegar o preço, se eu deixar dessa forma:
select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
,ci.CustoOCItem
–,case when m.ArquivoOrdemMov='OC’then ‘Possui preço de compra’
–else 'Sem valor’end
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
join OCItem ci on c.SeqOC=ci.SeqOC/coluna onde pega o preço(não tem nas demais queries)/
where m.ArquivoOrdemMov=‘OC’ and c.SituacaoOC=‘FECHADA’
O teu problema é que não podes misturar o preço de umas colunas (numerico) com a frase “Sem valor” (varchar).
Ou fazes cast do preço para varchar ou deixas como null e depois na camada de apresentação mostras os null como “Sem Preço” - esta segunda forma é a mais correta
Ok, consegui entender e fazer o seguinte select, não sei se esta certo mas não gerou erro: select '' as nulo, m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov, p.DescricaoProduto from Mov m join MovFisica f on m.SeqMovFisica=f.SeqMovFisica join MS s on m.ContadorAgenteMov=s.ContadorAgenteMS join Produto p on m.SeqProduto=p.SeqProduto join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC join OCItem ci on c.SeqOC=ci.SeqOC/*coluna onde pega o preço(não tem nas demais queries)*/ where m.ArquivoOrdemMov='MS' and s.SituacaoMS='FECHADA'