Inquiridor
Somar e Subtrair no mesmo Select

Pergunta
-
Bom dia, alguém pode me auxiliar com isso, nessa tabela abaixo esta informando o estoque de um produto o produto 290 onde o valor 15 e referente a entrada e o valor 4 e referente a saída do estoque. O sistema aqui da empresa nao trabalha com o numero negativo direto na coluna quantidade, ele da o campo IDN_estoque informando se e positivo ou negativo.
Agora a duvida e possível fazer um select para somar esses valor e o resultado ser 11 ?
Pois caso eu faça um sum na QTD ele vai ficar 19, gostaria de saber se tem uma forma que o Sum valide o +/-.
- Editado DaniloSimionato segunda-feira, 30 de março de 2020 15:40
Todas as Respostas
-
Danilo,
Este cenário é sempre desta forma, todas as movimentações de entrada recebem o código 901 e as saídas 902?
Se for, podemos pensar de uma forma bem simples, veja se este exemplo utilizando inicialmente CTE, te ajuda:
-- Criando a Tabela Estoque --
Create Table Estoque (CodProduto Int, CodOper Int, QTD Float, IDN_Estoque Char(1)) Go -- Inserindo os valores -- Insert Into Estoque Values (290, 901, 15, '+'),(290, 902, 4, '-'), (291, 901, 10, '+'),(291, 902, 2, '-'), (292, 901, 8, '+'),(292, 902, 5, '-'), (290, 901, 2, '+'),(290, 902, 4, '-') Go
-- Consultando -- Select * From Estoque Go
-- Criando as CTEs SomaEntradas e SomaSaidas -- ;With SomaEntradas (CodProduto, QTDEntrada) As (Select CodProduto, Sum(QTD) From Estoque Where CodOper = 901 Group By CodProduto) , SomaSaidas (CodProduto, QTDSaida) As (Select CodProduto, Sum(QTD) From Estoque Where CodOper = 902 Group By CodProduto)
-- Apresentando os valores -- Select SE.CodProduto, (SE.QTDEntrada-SS.QTDSaida) As Quantidade From SomaEntradas SE Inner Join SomaSaidas SS On SE.CodProduto = SS.CodProduto Go
Uma outra possibilidade seriamos fazer uso de Views:
-- Criando a View V_SomaEntrada --
Create View V_SomaEntrada As (Select CodProduto, Sum(QTD) As SomaEntrada From Estoque Where CodOper = 901 Group By CodProduto) Go
-- Criando a View V_SomaSaida -- Create View V_SomaSaida As (Select CodProduto, Sum(QTD) As SomaSaida From Estoque Where CodOper = 902 Group By CodProduto) Go
-- Apresentando os valores -- Select SE.CodProduto, (SE.SomaEntrada-SS.SomaSaida) As Quantidade From V_SomaEntrada SE Inner Join V_SomaSaida SS On SE.CodProduto = SS.CodProduto Go
Já este outro exemplo, você podera aplicar o conceito de Select Derivado:
Select Entrada.CodProduto, (Entrada.QTD - Saida.QTD) As Quantidade FROM (Select CodProduto, SUM(QTD) As QTD From Estoque Where CodOper=901 Group By CodProduto) AS Entrada Inner Join (Select CodProduto, SUM(QTD) As QTD From Estoque Where CodOper=902 Group By CodProduto) AS Saida On Entrada.CodProduto = Saida.CodProduto Go
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Editado Junior Galvão - MVPMVP segunda-feira, 30 de março de 2020 17:24
-
Boa tarde,
Danilo, confira o exemplo do tópico abaixo onde foi utilizado o comando Case dentro do Sum para obter o resultado:
Assinatura: http://www.imoveisemexposicao.com.br
-
Boa tarde,
Danilo, confira o exemplo do tópico abaixo onde foi utilizado o comando Case dentro do Sum para obter o resultado:
Assinatura: http://www.imoveisemexposicao.com.br
Gapimex,
Muito legal a sua abordagem, simples e prática, tomei a liberdade de elaborar um exemplo com base na sua ideia.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Danilo,
Tomando como base a sugestão do Gapimex, elaborei um outro exemplo:
-- Criando a Tabela -- Create Table Estoque (CodProduto Int, CodOper Int, QTD Float, IDN_Estoque Char(1)) Go -- Inserindo os valores -- Insert Into Estoque Values (290, 901, 15, '+'),(290, 902, 4, '-'), (291, 901, 10, '+'),(291, 902, 2, '-'), (292, 901, 8, '+'),(292, 902, 5, '-'), (290, 901, 2, '+'),(290, 902, 4, '-') Go -- Consultando -- Select * From Estoque Go -- Utilizando a função SUM() em combinação com o operador Case -- Select CodProduto, Sum(Case When CodOper = 901 Then + QTD Else - QTD End) As Quantidade From Estoque Group By CodProduto Go
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Danilo, você tentou adaptar as sugestões para o seu caso? Segue abaixo outro exemplo:
select codproduto, sum(qtd * case when idn_estoque = '+' then 1 else -1 end) as qtd from Tabela where codproduto = 290 group by codproduto
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br