使用递归CTE按指定容器大小拆分数量行的问题求解
递归CTE完全适用于该拆分场景,你原有代码出错的核心原因是递归过程中直接修改了Qty字段的取值,后续计算容器倍数时的基准已经不是原始总数量,而是上一轮递归后的剩余量,导致逻辑错乱。
修正后的可运行代码
DECLARE @ContainerSize int = 20; WITH ItemDetails (ItemID, Qty) AS ( -- 查询返回如下格式的示例数据 SELECT 29, 49 UNION ALL SELECT 33, 64 UNION ALL SELECT 38, 32 UNION ALL SELECT 41, 54 ), ItemDetailsSplit(ItemID, RemainingQty, BatchQty) AS ( -- 递归锚点:初始化剩余待拆分数量、第一批次的数量 SELECT ItemID, Qty - CASE WHEN Qty < @ContainerSize THEN Qty ELSE @ContainerSize END, CASE WHEN Qty < @ContainerSize THEN Qty ELSE @ContainerSize END FROM ItemDetails UNION ALL -- 递归迭代:计算下一批次数量,更新剩余待拆分量 SELECT ItemID, RemainingQty - CASE WHEN RemainingQty < @ContainerSize THEN RemainingQty ELSE @ContainerSize END, CASE WHEN RemainingQty < @ContainerSize THEN RemainingQty ELSE @ContainerSize END FROM ItemDetailsSplit WHERE RemainingQty > 0 -- 剩余量为0时停止拆分 ) SELECT ItemID, BatchQty AS Qty FROM ItemDetailsSplit ORDER BY ItemID, Qty DESC;
输出验证
运行上述代码后将得到符合需求的拆分结果:
- ItemID=29,对应数量20、20、9
- ItemID=33,对应数量20、20、20、4
- ItemID=38,对应数量20、12
- ItemID=41,对应数量20、20、14
内容的提问来源于stack exchange,提问作者scumdogg
相关产品推荐
相关产品推荐

