2017-09-22 7 views
0

次のsqlfiddleの例では、売り手に売り上げがない場合でも、特定の国のすべての売り手の売り上げリストを取得したいと考えています。LEFT JOINとGROUP BYのSUM - すべての行で同じ結果

http://www.sqlfiddle.com/#!9/b60247/10/0

SELECT ts.name AS seller_name, 
COALESCE(SUM(tsa.sales), 0) AS sales_total 
FROM tseller ts 
LEFT JOIN tseller_country tsc ON ts.id = tsc.name 
LEFT JOIN tsales tsa ON tsc.country = tsa.country 
WHERE tsa.country = '1' 
GROUP BY ts.name 
ORDER BY ts.id 

しかし代わりに、以下の結果を

Marie 370 
Peter 0 
Marge 0 

私は

を取得します
Marie 370 
Peter 370 
Marge 370 
+1

私はあなたの列の名前を変更することから始めます:例えば 'ts.id = tsc.name'が混乱してON

正しいバージョンは次のようなものである可能性があります。 –

+0

*誰が* * *何*を売ったのを知っていますか?そしてFWIW、私はテーブルの前に本当に面倒な 't'を貼り付ける練習を見つける。 – Strawberry

+0

私はそれを得ることはできません、 'tcountry'にはidだけがあります:1,2,3,4。 'tseller_country.country'カラムには値' 6'があります。 –

答えて

2

国IDのみで販売を選択します。したがって、すべてのユーザーに対して、指定された国で販売されている限り、同じ売上高が合計に使用されます。

sales joinの新しいルールを追加すると、合計が修正されます。結果の合計が0であることを確認するには、WHERE句を変更してtseller_countryテーブルをチェックする必要があります(合計0 =売上テーブルのエントリなし)。

SELECT ts.name AS seller_name, 
SUM(tsa.sales) AS sales_total 
FROM tseller ts 
LEFT JOIN tseller_country tsc ON ts.id = tsc.name 
LEFT JOIN tsales tsa ON tsc.country = tsa.country AND ts.id = tsa.name 

WHERE tsc.country = '1' 
GROUP BY ts.name 
ORDER BY ts.id 
+1

「LEFT JOIN x ... WHERE x = ...」は「INNER JOIN x ...」と同じです。 – Strawberry

+0

ありがとうイチゴ – josei

+0

ありがとうございましたJonas Schwabe。 – josei