2011-07-16 21 views
17

Tôi đang sử dụng MySQL và tôi có hai bảng:Làm thế nào để SUM và SUBTRACT bằng cách sử dụng SQL?

master_table

  • OrderNo
  • ITEM
  • QTY

stock_bal

  • ITEM
  • BAL_QTY

bảng Master có lặp lại ORDERNOITEM giá trị. Tôi đã nhận được tổng số QTY sử dụng mệnh đề 'GROUP BY' của SQL.

Tôi cần khấu trừ/trừ BAL_QTY từ SUM của ITEM (master_table). Tôi đã có giá trị SUM QTY sử dụng truy vấn (thực tế có nhiều hàng).

Trả lời

25

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm. NEW_BAL là tổng của QTY s trừ từ số dư:

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 

Nếu bạn muốn cập nhật số dư mục với sự cân bằng mới, sử dụng như sau:

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

này giả định bạn đăng trừ lùi ; nó trừ số lượng theo thứ tự từ số dư, điều này có ý nghĩa nhất mà không cần biết thêm về các bảng của bạn. Chỉ cần trao đổi hai để thay đổi nó nếu tôi đã sai:

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

điều này rất hữu ích và hoạt động tốt, cảm ơn rất nhiều .. tôi cũng cần cập nhật giá trị QTY bảng chính. giá trị này đến từ nhiều hàng .. làm thế nào tôi có thể làm điều này ... –

1

Tôi không chắc chắn chính xác những gì bạn muốn, nhưng tôi nghĩ đó là dọc theo dòng:

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

ah bài tập về nhà ...

Vì vậy, chờ đợi, bạn cần phải trích sự cân bằng của các mặt hàng trong kho từ tổng số những mặt hàng có được đặt hàng? Tôi phải nói với bạn rằng âm thanh hơi ngược lại. Nói chung tôi nghĩ mọi người làm theo cách khác. Khấu trừ tổng số mặt hàng được đặt hàng từ số dư.

Nếu bạn thực sự cần phải làm điều đó mặc dù ... Giả sử ITEM mà là duy nhất trong 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

Tôi đã thử loại kỹ thuật. Nhân số trừ khỏi dữ liệu bằng (-1) và sau đó tổng() cả hai số tiền sau đó bạn sẽ nhận được số tiền trừ.

-- 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 
Các vấn đề liên quan