2016-10-03 3 views
0

受注数から受け取った数量を引いた値の取得に問題があります。ジョインとSUMのトラブル()

テーブルの基本的なバージョンは、そこで、基本的私はバックオーダーに残っているどのように多くのpartid 12345のために知ってほしい

order_main 
id | status 
1 | 2 
2 | 1 
3 | 3 
4 | 2 

order_part 
id | partid | quantity | status | order_main_id 
1 | 12345 | 100  | 2  | 1 
2 | 23456 | 20  | 3  | 1 
3 | 555 | 15  | 1  | 2 
4 | 666 | 10  | 3  | 3 
5 | 12345 | 40  | 2  | 4 


order_reception 
id | order_main_id 
1 | 2 
2 | 2 
3 | 2 
4 | 3 

order_reception_part 
id | partid | quantity | order_reception_id 
1 | 12345 | 40  | 1 
2 | 23456 | 20  | 1 
3 | 12345 | 10  | 2 
4 | 12345 | 20  | 3 
5 | 666 | 10  | 4 

のように見えます。 結果は

partid | in_order 
12345 | 70 

(+ 40 100)のようになります - (40 + 10 + 20)

私の試みでの問題は、私が注文数量を合計しようとしたとき、私は* 100 3を得たということでしたすべての受信+ 40のための1 order_partが直接注文する準備ができましたorder_reception_part

エキストラ情報のステータス1 =、ステータス2 =順序にリンクされていないので、3 =

を受信し、私は私がのために十分にそれを説明している願っていますそうでなければ、私に追加情報を求めてください。

次のクエリでは、SUM()orp.quantityである必要がありますが、結果は受信ごとに100と表示されますが、他の注文からは100回1回+ 80回だけ必要です。

SELECT om.id, op.quantity, orp.quantity 
FROM order_main om 
JOIN order_part op ON om.id = op.order_main_id 
LEFT JOIN order_reception `or` ON om.id = or.order_main_id 
LEFT JOIN order_reception_part orp ON or.id = orp.order_reception_id 
WHERE op.partid = 12345 
AND op.status = 2 
+0

TL; DR「SUM(DISTINCT your_primary_key_here)」です。 –

+1

+80がどこから来ているのか分かりません。 – apokryfos

+0

@apokryfos申し訳ありませんが、それは+40でなければなりません。 – Bart

答えて

0

簡単な解決策は次のようになります。

SELECT (
    SELECT SUM(quantity) 
    FROM order_part 
    WHERE order_part.partid=12345 - 
    SELECT SUM(quantity) 
    FROM order_reception_part 
    WHERE order_reception_part.partid=12345 
); 
+0

なぜ、私はこれがうまくいきませんでしたか?ありがとう – Bart

+0

私はいくつかのテストをしましたが、注文は50 x 123の部分を持ち、25 x 123を受け取り、他の部分は配送できないので、この注文はステータス4を取得するので、これは常に機能しません。 50はステータス2が整っているので追加されませんが、受信したパーツには25パーツが追加されています。ですから、私は本当にpartid_receivedとorderidでリンクする必要があります。 – Bart

0

私は自分自身に答えることがわかりました。結合を使用して正しいorp.quantityを取得し、サブクエリを使用してオーバーオールop.quantityを取得し、それらを減算します。

SELECT (
    SELECT SUM(quantity) 
    FROM order_part 
    WHERE partid = p.partid 
    AND `status` = 2 
) - IFNULL(SUM(orp.quantity), 0) 

FROM order_main om 
JOIN order_part op ON om.id = op.order_main_id 
LEFT JOIN order_reception `or` ON om.id = or.order_main_id 
LEFT JOIN order_reception_part orp ON or.id = orp.order_reception_id 
AND orp.partid = op.partid 
WHERE op.partid = p.partid 
AND op.status = 2