question

JacquelineBdaCruz-2773 avatar image
0 Votes"
JacquelineBdaCruz-2773 asked JacquelineBdaCruz-2773 answered

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’

sql-server-generalsql-server-transact-sql
· 2
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

I'm sorry, but you need to clean up your post.

First of all, the language is expected in this forum is English. Personally, I can read Portuguese to some extent, but I can't read a SELECT query which is posted as running text and where normal single quotes have been replaced by "smart quotes".

There is a button with ones and zeroes on it. Use that to insert code. And don't copy the query from Word, but copy it from SSMS in a readable form.

0 Votes 0 ·

Olá, como disse inicialmente sou nova por aqui e segue o comando da forma correta:

 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 então preciso fazer um select join para pegar um preço que esta em uma tabela que faz join com a tabela de compras*/

`` 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 em m.SeqProduto = p.SeqProduto
where m.ArquivoOrdemMov = 'OC' e c.SituacaoOC = 'FECHADA'




0 Votes 0 ·
MelissaMa-msft avatar image
0 Votes"
MelissaMa-msft answered JacquelineBdaCruz-2773 commented

Hi @JacquelineBdaCruz-2773,

Please refer below and check whether it is helpful.

 select  m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto 
  ,'Sem valor'
  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 
  ,'Sem valor'
  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
 ,'Possui preço de compra'
  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'

Best regards
Melissa


If the answer is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

· 1
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Muito obrigada MelissaMa-msft, com o que me mandou consegui resolver fazendo uma pequena alteração.
Agradeço muito mesmo, vou mandar como ficou.



0 Votes 0 ·
GuoxiongYuan-7218 avatar image
0 Votes"
GuoxiongYuan-7218 answered JacquelineBdaCruz-2773 commented

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

Post the SELECT statement to get the price.

· 1
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Obrigado por responder, segue o select :

 select ci.CustoOCItem from OCItem ci join OC c on ci.SeqOC=c.SeqOC
0 Votes 0 ·
MelissaMa-msft avatar image
0 Votes"
MelissaMa-msft answered JacquelineBdaCruz-2773 commented

Hi @JacquelineBdaCruz-2773

Welcome to Microsoft Q&A!

Please post this question in English so that all of us could undertand your requiremnet well and help you further.

Besides, you could post your code by clicking below icon in red box.

78983-code.png

According to limited information you provided, please refer below example and check whether it is helpful.

Suppose there is one column named price which is your purchase price from OC table.

 select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto 
 ,case when m.ArquivoOrdemMov='OC'then (select c.price from OC c where m.ContadorAgenteMov=c.ContadorAgenteOC and c.SituacaoOC='FECHADA') 
 else 'Sem valor'end 
 from Mov m 
 join MovFisica f 
 on m.SeqMovFisica=f.SeqMovFisica 
 join Produto p on m.SeqProduto=p.SeqProduto 

If above is not working, we recommend that you post CREATE TABLE statements for your tables together with INSERT statements with sample data, enough to illustrate all angles of the problem. We also need to see the expected result of the sample.

Best regards
Melissa


If the answer is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


code.png (11.6 KiB)
· 3
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Obrigada Melissa, segue o código:

 select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
 ,case when m.ArquivoOrdemMov='OC'then
 'Preco'
 /*para mostrar o preço preciso fazer um select join  da tabela OCitem (onde esta o preço) com a OC (onde esta o pedido 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
 where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA



0 Votes 0 ·
MelissaMa-msft avatar image MelissaMa-msft JacquelineBdaCruz-2773 ·

Hi @JacquelineBdaCruz-2773

Thanks for your update.

Could you please also provide some sample data and expected output?

Otherwise we could only guess your requirement and proceed with this query inefficiently.

Thank you for understanding!

Best regards
Melissa

0 Votes 0 ·

Obrigado MelissaMa-msft.
Publiquei o meu select junto com o union.

0 Votes 0 ·
ErlandSommarskog avatar image
0 Votes"
ErlandSommarskog answered JacquelineBdaCruz-2773 edited

Talvez:

select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
     ,case when m.ArquivoOrdemMov='OC' then
          ( select ci.CustoOCItem from OCItem ci where ci.SeqOC=c.SeqOC)
     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'

Mas são somente adivinhando...

· 3
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Obrigado por responder mas não deu certo, o subselect deu erro. Pelo que andei pesquisando o problema esta em substituir um campo nulo por não nulo.

0 Votes 0 ·

As I said, I was only guessing.

And I'm afraid that as long as you only post in Portuguese and don't provide an example with CREATE TABLE + INSERT with sample data, we will not make much progress.

0 Votes 0 ·

Olá ErlandSommarkog, preciso gerar um relatório, nele deve constar a quantidade de entrada e saída dos produtos por período. Só que tem 2 opções de entradas, uma é a movimentação de entrada e a outra é a compra de produtos. Na compra de produtos tem o preço de compra (custo) e é aí que esta o problema.
Quando identifico que foi uma compra preciso pegar o preço deste produto e quando não para tem que ficar como sem preço, entendeu?
O que fiz neste caso fiz 3 queries uma pegando um movimento de saída, outra de entrada e a outra que tem o preço de compra, fiz um union com as 3 sem colocar a informação do preço nas 3, vou mandar as queries, deixei como comentários a parte que tem que pegar o preço.

0 Votes 0 ·
GuoxiongYuan-7218 avatar image
0 Votes"
GuoxiongYuan-7218 answered JacquelineBdaCruz-2773 commented

How about this:

 select m.ArquivoOrdemMov,
     m.ContadorAgenteMov,
     m.DataMov,
     m.SeqOrdemMov,
     m.SeqProduto,
     m.SaldoTotalMov,
     p.DescricaoProduto,
 case when m.ArquivoOrdemMov = 'OC' then ci.CustoOCItem else 'Sem valor' end
 from Mov m 
 join MovFisica f on m.SeqMovFisica=f.SeqMovFisica 
 join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC 
 LEFT JOIN OCItem ci ON c.SeqOC = ci.SeqOC
 join Produto p on m.SeqProduto=p.SeqProduto 
 where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA'
· 1
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Olá GuoxiongYuan-7218, o select esta certo, o problema é que preciso fazer um union.

0 Votes 0 ·
JacquelineBdaCruz-2773 avatar image
0 Votes"
JacquelineBdaCruz-2773 answered JacquelineBdaCruz-2773 published
 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/*coluna onde pega o preço(não tem nas demais queries)*/
 where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA'
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

JacquelineBdaCruz-2773 avatar image
0 Votes"
JacquelineBdaCruz-2773 answered
   select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.QtdOperacaoFisicaMov,p.DescricaoProduto 
       ,'Sem valor' as Preco
       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.QtdOperacaoFisicaMov,p.DescricaoProduto 
       ,'Sem valor' as Preco
       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 distinct m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.QtdOperacaoFisicaMov,p.DescricaoProduto
      ,convert (varchar,ci.CustoOCItem) as Preco
       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'
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.