You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:48:03