如何在复杂条件下计算组合套装的最大可生产数量
计算套装最大可生产数量的实现方法
核心思路
要算出每个套装的最大可生产数,关键是找到套装里最“拖后腿”的子件——也就是每个子件库存能支撑的套数的最小值。具体分三步实现:
步骤1:统计每套所需子件的数量
先从组合表composition按套装(parent)和子件(child)分组,统计每个子件在单套中的需求量:
SELECT parent, child, COUNT(child) AS required_qty FROM composition GROUP BY parent, child;
执行后得到子件需求量统计:
parent child required_qty A B 2 A C 1 D E 1 D F 1
步骤2:关联库存表计算子件可支撑的套数
将上述结果与库存表stock关联,用子件库存数除以单套需求量,得到该子件能支持的套装数量(用整数除法确保结果为整数套):
SELECT c.parent, s.stock / c.required_qty AS possible_sets FROM ( SELECT parent, child, COUNT(child) AS required_qty FROM composition GROUP BY parent, child ) c JOIN stock s ON c.child = s.code;
执行后得到各子件的可支撑套数:
parent possible_sets A 2 -- B库存4 ÷ 2 A 3 -- C库存3 ÷ 1 D 6 -- E库存6 ÷ 1 D 7 -- F库存7 ÷ 1
步骤3:取每个套装的最小支撑数
对每个套装(parent),取所有子件可支撑套数的最小值,即为该套装的最大可生产数量:
SELECT parent, MIN(s.stock / c.required_qty) AS numberOfSet FROM ( SELECT parent, child, COUNT(child) AS required_qty FROM composition GROUP BY parent, child ) c JOIN stock s ON c.child = s.code GROUP BY parent;
最终得到期望结果:
parent numberOfSet A 2 D 6
补充说明
- 若使用的数据库不支持自动整数除法(如PostgreSQL),可改用
FLOOR(s.stock / c.required_qty)或DIV运算符保证结果为整数; - 若子件库存为0,
possible_sets会是0,对应套装的可生产数也为0,符合实际生产逻辑; - 套装自身的库存(如A、D的库存)不参与计算,因为我们统计的是用子件组装新套装的能力,成品库存不影响生产上限。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

