MySQL按Part_ID分组求和Production_Needed获取需生产未完成订单问题
核心问题解答
你定义的SUM(ord.quantity_ordered - ord.quantity_shipped - part.Inventory)逻辑不能放在WHERE子句中。
SQL的执行顺序为FROM/JOIN → WHERE → GROUP BY → 聚合计算 → HAVING → SELECT → ORDER BY,WHERE执行阶段还未完成GROUP BY聚合操作,无法识别SUM这类聚合函数的计算结果,聚合结果的过滤必须放到HAVING子句中。
现有SQL问题说明
你当前使用GROUP BY Order_Part_ID的写法会把同一个零件的多条订单合并为一行,天然无法返回该零件对应的所有订单条目。要实现「返回需要生产的零件的所有对应订单」的需求,需要先计算得到需要生产的零件ID列表,再关联原订单表匹配所有符合条件的订单。
正确实现代码
SELECT ord.part_id AS Part_ID, ord.quantity_ordered, ord.quantity_shipped FROM production_orders ord JOIN production_part part ON ord.part_ID = part.part_ID WHERE ord.is_Active = TRUE AND ord.order_type = 0 -- 仅保留需要生产的零件对应的订单 AND ord.part_id IN ( SELECT ord_inner.part_id FROM production_orders ord_inner JOIN production_part part_inner ON ord_inner.part_ID = part_inner.part_ID WHERE ord_inner.is_Active = TRUE AND ord_inner.order_type = 0 GROUP BY ord_inner.part_id, part_inner.Inventory -- 总未发货量 > 库存,即需要安排生产 HAVING SUM(ord_inner.quantity_ordered - ord_inner.quantity_shipped) > part_inner.Inventory ) ORDER BY ord.part_id ASC
逻辑验证
对应你提供的样例数据:
- 零件1总未发货量为8000,库存12500,8000 < 12500,无需生产,被过滤
- 零件2总未发货量为(1000-500)+(1000-0)=1500,库存0,1500 > 0,需要生产,保留两条对应订单
- 零件3订单类型为1,不符合order_type=0的过滤条件,被排除
最终返回结果和你的预期完全一致。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

