none
Somar e Subtrair no mesmo Select RRS feed

  • 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 +/-.


    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]

    segunda-feira, 30 de março de 2020 16:54
  • Boa tarde,

    Danilo, confira o exemplo do tópico abaixo onde foi utilizado o comando Case dentro do Sum para obter o resultado:

    https://social.msdn.microsoft.com/Forums/pt-BR/6154bd05-88d2-4749-9214-53421436dbc5/subtrao-no-sql-server?forum=520

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 30 de março de 2020 17:34
  • Boa tarde,

    Danilo, confira o exemplo do tópico abaixo onde foi utilizado o comando Case dentro do Sum para obter o resultado:

    https://social.msdn.microsoft.com/Forums/pt-BR/6154bd05-88d2-4749-9214-53421436dbc5/subtrao-no-sql-server?forum=520

    Espero que ajude


    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]

    segunda-feira, 30 de março de 2020 17:51
  • 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]

    segunda-feira, 30 de março de 2020 17:52
  • Sim sempre seguem esse padrão, so mudam a quantidade, os demais campos seguem sempre as mesmas infos. 
    segunda-feira, 30 de março de 2020 20:18
  • 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

    segunda-feira, 30 de março de 2020 20:49