2016-10-03 51 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