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

使用递归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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:15:07