2016-10-03 63 views
0

我在檢索訂單數量減去收到的數量時遇到了問題。連接問題和SUM()

表的基本版本看起來像

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 12345多少仍處於缺貨。 結果應該像

partid | in_order 
12345 | 70 

(100 + 40) - (40 + 10 + 20)

我嘗試的問題是,當我試圖總結我得到了3 * 100的訂單數量一個用於每個接收+ 40,因爲order_part不直接鏈接到order_reception_part

額外的信息狀態1 =準備訂購,狀態2 =有序,3 =接收

我希望我已經解釋過它不夠好,你瞭解,否則請問我額外的信息。

下面的查詢將說明我的意思,我需要的orp.quantitySUM()每個訂單,但結果會顯示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,然後在第一個SUM 50不會被添加,因爲狀態2是有序的,但是在收到的部分中現在有25個額外的部分。所以我真的需要通過orderid將part鏈接到part_received。 – Bart

0

我發現自己的答案。使用連接te得到正確的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