2016-10-26 25 views
1

SELECT文を実行すると、IFNULL部分とSUM CASE部分が2回実行されます。私はそれがステートメントの余りに多くのLEFT JOINと関係があることを知っています。しかし、問題の解決策を見つけることができません。MySQL SELECTが複数回実行される

問題を説明するのは難しいので、私はsqlfiddleリンクを含めました。

SQLFIDDLE

SELECT 
IFNULL(SUM(d.quantity),0) as dispatch, 
SUM(CASE WHEN t.valuefor='alpha' THEN t.quantity ELSE 0 END) as alpha, 
SUM(CASE WHEN t.valuefor='beta' THEN t.quantity ELSE 0 END) as beta 
FROM conversion as c 
LEFT JOIN sale as s ON s.conversionid = c.id 
LEFT JOIN dispatch as d ON d.saleid = s.id 
LEFT JOIN test as t ON t.conversionid = c.id 

電流出力

dispatch alpha beta 
1800  1400 80 

理想

dispatch alpha beta 
600   700  40 
+0

あなたの結合がデカルト積を引き起こしています。ジョインを行う前に*集計を行う必要があります。 –

+0

その部分私は、これらの結合ステートメントでなければならないことを理解しています。しかし、問題の解決方法を理解することはできません。 –

答えて

2

あなたは派遣値を合計分離する必要がある出力、およびテスト値 - このような何かを与える可能性がありあなたが望む答え:

Select A.dispatch, 
SUM(CASE WHEN t.valuefor='alpha' THEN t.quantity ELSE 0 END) as alpha, 
SUM(CASE WHEN t.valuefor='beta' THEN t.quantity ELSE 0 END) as beta 
FROM(
    SELECT sum(quantity) AS dispatch, c.id 
    FROM conversion as c 
    LEFT JOIN sale as s ON s.conversionid = c.id 
    LEFT JOIN dispatch as d ON d.saleid = s.id 
    GROUP BY d.saleid) A 
LEFT JOIN test as t ON t.conversionid = A.id 
group by A.id; 

内部サブクエリはディスパッチ値を合計し、テスト量を加算します。

+0

クエリにエラーがあります。コンバージョンテーブルに値を追加すると、コンバージョンIDごとに結果が表示されません。 –

+0

私の編集を参照してください - それはそれを修正するかもしれません。追加のデータでsqlfiddleを更新しないと、もう一度見ます – PaulF

1

は、この方法を試してください:

SELECT 
    IFNULL(SUM(d.quantity),0) as dispatch, 
    SUM(t.alpha) as alpha, 
    SUM(t.beta) as beta 
FROM conversion as c 
LEFT JOIN sale as s ON s.conversionid = c.id 
LEFT JOIN (
    SELECT saleid, SUM(quantity) AS quantity 
    FROM dispatch 
    GROUP BY saleid) as d ON d.saleid = s.id 
LEFT JOIN (
    SELECT conversionid, 
      SUM(CASE WHEN valuefor='alpha' THEN quantity ELSE 0 END) as alpha, 
      SUM(CASE WHEN valuefor='beta' THEN quantity ELSE 0 END) as beta 
    FROM test 
    GROUP BY conversionid) as t ON t.conversionid = c.id 

上記のクエリは、前に、これらのテーブルは、LEFT JOIN操作で使用され、テーブルdispatchtestに集約を行います。

Demo here

+0

クエリにエラーがあります。コンバージョンテーブルに値を追加すると、コンバージョンIDごとに結果が表示されません。 –

関連する問題