2011-10-26 23 views
1

我有這些SQL表如何獲得每個唯一'列'的SUM()?

供應商

SUPPLIERID | SUPPLIERNAME 
1   | sup1 
2   | sup2 
3   | sup3 

銷售

ITEMID | SOLD | SUPPLIER ID | DATE 
pen | 10 | 1   | 2011-10-21 
pen | 5 | 1   | 2011-10-22 
pen | 5 | 1   | 2011-10-23 
pen | 20 | 3   | 2011-10-24 

買我目前使用這個腳本

ITEMID | BOUGHT | SUPPLIER ID | DATE 
pen | 20  | 1   | 2011-9-21 
pen | 5  | 3   | 2011-9-24 

,但它似乎不工作因爲銷售和購買的SUM()增加了三倍。我懷疑是因爲有3排已售出,但只有2排已售出。任何想法如何解決這個問題?

SELECT suppliername, SUM(sold) as sold, SUM(bought) AS bought 
    FROM sold s 
LEFT JOIN supplier sp 
     ON s.supplierid = sp.supplierid 
LEFT JOIN bought b 
     ON sp.supplierid = b.supplierid 
GROUP BY suppliername 

回答

3
SELECT suppliername, Sold, Bought 
FROM Supplier sp 
LEFT JOIN (SELECT SupplierId, SUM(Sold) Sold 
      FROM sold 
      GROUP BY SupplierId) s 
ON sp.SupplierId = s.SupplierId 
LEFT JOIN (SELECT SupplierId, SUM(bought) bought 
      FROM bought 
      GROUP BY SupplierId) b 
ON sp.SupplierId = b.SupplierId 

基本上,我在做什麼是計算賣出金額和購買金額爲每個供應商ID分開(在LEFT JOIN S),所以我總是有總銷售金額和總金額買的。我在LEFT JOIN中使用的查詢稱爲派生表,因爲它們在普通查詢中表現得像一張表。希望這可以幫助你更清楚地瞭解我所做的事情。

+0

它的工作原理,謝謝!請問你能否解釋你剛剛做了什麼以及「衍生」表格是什麼意思?當我試圖刪除s&b時,我得到了這個錯誤。 – JohnSmith

+1

@JohnSmith - 好的,對不起,我添加了一個解釋,希望它有幫助 – Lamak

+0

感謝您的解釋。我開始明白了。最後一個問題。我試着在SOLD派生查詢中包含日期以及頂級SELECT語句,並且當我在SQL中執行它時,我獲得了一個NULL值。我究竟做錯了什麼? – JohnSmith

1

根據給定的數據,我期望看到供應商1的結果增加了三倍,對供應商2沒有任何返回,對於供應商3沒有返回正確數量。這是因爲您隱含地鏈接了每個供應商的每個銷售結果,從每個供應商購買的每個結果。

相反,嘗試:

select supplierid, max(suppliername) suppliername, sum(bought) bought, sum(sold) sold 
from (
    select supplierid, suppliername, 0 bought, 0 sold from supplier union all 
    select supplierid, '' suppliername, bought, 0 sold from bought union all 
    select supplierid, '' suppliername, 0 bought, sold from sold) ilv 
group by supplierid;