Select join dentro de um case com select join

Olá, Tudo bem ?

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’

Para garantir que a solução funcione seria interessante saber qual banco de dados exatamente está usando, mas tenho duas sugestões.

Você pode colocar uma subquery naquele case, algo assim:

case when m.ArquivoOrdemMov='OC’ then (select preco from compras c where c.produto = p.id) preco

Outra seria fazer um left join diretamente com a tabela de compras com a mesma condição do case:

join Produto p on m.SeqProduto=p.SeqProduto
left join Compras c on p.id = c.produto and m.ArquivoOrdemMov='OC’

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:

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’
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’.

As três queries podem ter preço? Se sim, tens de adicionar a coluna às três. Senão, tens de colocar null nessa coluna

(...) p.DescricaoProduto, null as precoCompra
 FROM  (...)

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'