如何在Oracle SQL中按商品计算逐行Avail_to_fill
Oracle SQL 实现按商品分组的Avail_to_fill累计计算
需求说明
给定如下基础表数据:
| ORDER# | Date | Item | Qty | Onhand | Avl Fill |
|---|---|---|---|---|---|
| 100030505 | 2024-11-19 | 862181010 | 84.00000 | 164 | 80 |
| 100030505 | 2024-11-20 | 862181010 | 85.00000 | 164 | -5 |
| 100030505 | 2024-11-21 | 862181010 | 86.00000 | 164 | -91 |
| 100030505 | 2024-11-22 | 862181010 | 87.00000 | 164 | -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; -- 替换为你的实际表名
代码解释
PARTITION BY Item:按商品ID分组,每个商品独立计算累计值,切换商品时自动重置计算起点。ORDER BY Date:确保每个分组内的行按日期顺序排列,保证累计计算的顺序正确。ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:指定窗口范围为当前分组的第一行到当前行,实现Qty的累计求和。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
相关产品推荐
相关产品推荐

