2011-07-16 41 views
17

我使用MySQL和我有兩個表:如何SUM和SUBTRACT使用SQL?

master_table

  • ORDERNO
  • 項目
  • 數量

stock_bal

  • 項目
  • BAL_QTY

主表中有重複的ORDERNOITEM值。我使用SQL'GROUP BY'子句得到總計QTY

我需要從ITEM(master_table)中扣除/減去BAL_QTY。我使用查詢得到SUM QTY值(實際上有很多行)。

回答

25

我認爲這是你在找什麼。 NEW_BALQTY■從餘額中扣除的總和:

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 

如果您想更新與新的平衡項目的平衡,使用以下命令:

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

這是假設你張貼的減法落後;它會從餘額中減去訂單中的數量,這在最不瞭解您的表格的情況下最有意義。只是交換這兩個改變它,如果我錯了:功課

(SUM(master_table.QTY) - stock_bal.BAL_QTY) AS NEW_BAL 
+0

這是非常有幫助和工作正常,,非常感謝..也需要更新主表的QTY值。這個值來自很多行..我怎麼能這樣做... –

1

我不知道你想要什麼,但我認爲它的線沿線的是:

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 
0

啊......

所以等待,您需要從那些有項目總數扣除項目餘額中股票已下令?我必須告訴你,這聽起來有點倒退。一般來說,我認爲人們是這樣做的。扣除從餘額中訂購的項目總數。

如果你真正需要做的,雖然...... 假設項目在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

我曾嘗試這種技術。將減去的數據乘以(-1),然後求和()這兩個量,然後你將得到減去的量。

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