2011-10-26 10 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倍になったためです。私は理由があると思うが、売り上げは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 

基本的に、私がやっていることは販売量を算出し、量は(LEFT JOIN秒で)別にすべての仕入先のために買ったので、私はいつも全量が販売され、合計金額が買っています。私がLEFT JOINで使用しているクエリは、一般クエリのテーブルのように動作しているため、派生テーブルと呼ばれています。これが私のしたことをより明確に理解するのに役立ちます。

+0

それは動作しますが、感謝を!あなたが今行ったことと「派生した」表が意味することを説明できるかどうか聞いてもよろしいですか?私はs&bを削除しようとしたときにエラーが発生しました。 – JohnSmith

+1

@ JohnSmith - 申し訳ありませんが、説明を追加しました。助けてくれることを願っています。 – Lamak

+0

ありがとうございます。私はそれを取得し始めています。最後の1つの質問。私はSOLDの派生クエリとトップSELECTステートメントに日付を含めようとしましたが、ImをSQLで実行するとNULL値を取得しました。私は間違って何をしていますか? – JohnSmith

1

サプライヤ1の結果が3倍になることが予想されますが、サプライヤ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;