Como somar e subtrair usando SQL?

Estou a usar o MySQL e tenho duas mesas:

master_table

  • ORDERNO
  • ITEM
  • QTY

stock_bal

  • ITEM
  • BAL_QTY

a tabela principal tem valores duplicados ORDERNO e ITEM. Eu tenho total QTY Usando a cláusula SQL 'GROUP BY'.

preciso de deduzir / subtrair BAL_QTY da soma de ITEM (master_table). Eu tenho o valor SUM QTY Usando a consulta (na verdade, existem muitas linhas).

Author: Devin Burke, 2011-07-16

4 answers

Acho que é disto que estás à procura. NEW_BAL é a soma de QTYsubtraída do saldo:
SELECT   master_table.ORDERNO,
         master_table.ITEM,
         SUM(master_table.QTY),
         stock_bal.BAL_QTY,
         (stock_bal.BAL_QTY - SUM(master_table.QTY)) AS NEW_BAL
FROM     master_table INNER JOIN
         stock_bal ON master_bal.ITEM = stock_bal.ITEM
GROUP BY master_table.ORDERNO,
         master_table.ITEM

Se quiser actualizar o saldo do item com o novo saldo, use o seguinte:

UPDATE stock_bal
SET    BAL_QTY = BAL_QTY - (SELECT   SUM(QTY)
                            FROM     master_table
                            GROUP BY master_table.ORDERNO,
                                     master_table.ITEM)

Isto assume que você postou a subtração para trás; subtrai as quantidades na ordem a partir do saldo, o que faz mais sentido sem saber mais sobre as suas tabelas. Troque esses dois para mudá-lo se eu estivesse errado.

(SUM(master_table.QTY) - stock_bal.BAL_QTY) AS NEW_BAL
 29
Author: Devin Burke, 2011-07-16 03:54:07
Não sei exactamente o que queres, mas acho que é o seguinte:
SELECT `Item`, `qty`-`BAL_QTY` as `qty` FROM ((SELECT Item, SUM(`QTY`) as qty FROM `master_table` GROUP BY `ITEM`) as A NATURAL JOIN `stock_table`) as B
 1
Author: Paulpro, 2011-07-16 03:31:54
Trabalho de casa... Então, espere, você precisa deduzir o saldo de itens em estoque do número total desses itens que foram encomendados? Tenho de te dizer que isso soa um pouco ao contrário. Geralmente, acho que as pessoas o fazem ao contrário. Deduzir o número total de itens encomendados do saldo. Se realmente precisares de fazer isso... Assumindo que esse ITEM é único em stock_bal...
SELECT s.ITEM, SUM(m.QTY) - s.QTY AS result
FROM stock_bal s
INNER JOIN master_table m ON m.ITEM = s.ITEM
GROUP BY s.ITEM, s.QTY
 0
Author: Tory Netherton, 2011-07-16 03:51:42
Já tentei este tipo de técnica. Multiplique o subtract dos dados por (-1) e então sum () a quantidade de ambos então você obterá a quantidade subtraída.
-- Loan Outstanding
    select  'Loan Outstanding' as Particular, sum(Unit), sum(UptoLastYear), sum(ThisYear), sum(UptoThisYear)
    from
    (
        select 
            sum(laod.dr) as Unit,
            sum(if(lao.created_at <= '2014-01-01',laod.dr,0)) as UptoLastYear,
            sum(if(lao.created_at between '2014-01-01' and '2015-07-14',laod.dr,0)) as ThisYear,
            sum(if(lao.created_at <= '2015-07-14',laod.dr,0)) as UptoThisYear
        from loan_account_opening as lao
        inner join loan_account_opening_detail as laod on lao.id=laod.loan_account_opening_id
        where lao.organization = 3
        union
        select
            sum(lr.installment)*-1 as Unit,
            sum(if(lr.created_at <= '2014-01-01',lr.installment,0))*-1 as UptoLastYear,
            sum(if(lr.created_at between '2014-01-01' and '2015-07-14',lr.installment,0))*-1 as ThisYear,
            sum(if(lr.created_at <= '2015-07-14',lr.installment,0))*-1 as UptoThisYear
        from loan_recovery as lr
        inner join loan_account_opening as lo on lr.loan_account_opening_id=lo.id
        where lo.organization = 3
    ) as t3
 0
Author: Binaya Shrestha, 2015-07-30 06:19:22