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

如何在Oracle SQL中按商品计算逐行Avail_to_fill

Oracle SQL 实现按商品分组的Avail_to_fill累计计算

需求说明

给定如下基础表数据:

ORDER#DateItemQtyOnhandAvl Fill
1000305052024-11-1986218101084.0000016480
1000305052024-11-2086218101085.00000164-5
1000305052024-11-2186218101086.00000164-91
1000305052024-11-2286218101087.00000164-178

需要计算Avail_to_fill列,规则如下:

  • 每个Item分组的第一行:Onhand - Qty
  • 后续行:用上一行的Avail_to_fill结果减去当前行的Qty
  • 按Item分组,商品变更时重新开始计算

解决方案

可以利用Oracle的分析函数SUM()结合窗口子句实现这类累计计算,核心逻辑是用初始库存Onhand减去当前分组内从第一行到当前行的Qty累计总和,完全匹配需求规则。

完整SQL代码

SELECT 
    ORDER#,
    Date,
    Item,
    Qty,
    Onhand,
    -- 按Item分组,按日期排序,计算累计Qty后用Onhand减去该值得到Avail_to_fill
    Onhand - SUM(Qty) OVER (
        PARTITION BY Item 
        ORDER BY Date 
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS Avail_to_fill
FROM 
    your_table_name; -- 替换为你的实际表名

代码解释

  1. PARTITION BY Item:按商品ID分组,每个商品独立计算累计值,切换商品时自动重置计算起点。
  2. ORDER BY Date:确保每个分组内的行按日期顺序排列,保证累计计算的顺序正确。
  3. ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:指定窗口范围为当前分组的第一行到当前行,实现Qty的累计求和。
  4. Onhand - SUM(Qty)...:等价于第一行的Onhand - Qty,后续行则是用上一行的结果(即Onhand - 之前累计Qty)减去当前Qty,完全符合需求规则。

结果验证

执行上述SQL后,得到的Avail_to_fill列与示例结果完全一致:

  • 第一行:164 - 84 = 80
  • 第二行:164 - (84+85) = -5
  • 第三行:164 - (84+85+86) = -91
  • 第四行:164 - (84+85+86+87) = -178

内容的提问来源于stack exchange,提问作者Yogesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:25:10