有两张表如下示例,记录库存数据和需要剔除的库存数量应该如何写语句进行剔除?
库存表
| 商品 | 批号 | 库存数量 |
| 商品A | 01 | 1000 |
| 商品A | 02 | 500 |
| 商品B | 01 | 1000 |
需剔除库存表
| 商品| 剔除数量 |
| 商品A | 1200 |
| 商品B| 200 |
剔除结果
| 商品 | 批号 | 库存数量 |
| 商品A | 01 | 0 |
| 商品A | 02 | 300 |
| 商品B | 01 | 800 |
过程语句应该如何写
使用类似如下SQL:
with 累计库存表 as (
select a.商品, a.批号, a.库存数量, sum(a.库存数量) over(partition by a.商品 order by a.批号) 累计库存数量
row_number() over(partition by a.商品 order by a.批号) 批次序号,
nvl(b.剔除数量,0) 剔除数量
from 库存表 a left join 需剔除库存表 b on a.商品=b.商品
),
剔除分界序号表 as (
select 商品, min(批次序号) 剔除分界序号
from 累计库存表
where 累计库存数量>=剔除数量
group by 商品
)
select c.商品, c.批号,
case when c.批次序号<d.剔除分界序号 then 0
when c.批次序号=d.剔除分界序号 then c.累计库存数量-d.剔除数量
else c.库存数量 end as 库存数量
from 累计库存表 c, 剔除分界序号表 d
where c.商品=d.商品
上述SQL说明如下:
累计库存表数据:
| 商品 | 批号 | 库存数量 | 累计库存数量 | 批次序号 | 剔除数量
| 商品A | 01 | 1000 | 1000 | 1 | 1200
| 商品A | 02 | 500 | 1500 | 2 | 1200
| 商品A | 03 | 200 | 1700 | 3 | 1200
| 商品B | 01 | 1000 | 1000 | 1 | 200
剔除分界序号表数据:
| 商品 | 剔除分界序号
| 商品A | 2
| 商品B | 1
累计库存表关联剔除分界序号表结果说明:
| 商品 | 批号 | 库存数量 | 累计库存数量 | 批次序号 | 剔除数量 | 剔除分界序号 | 说明
| 商品A | 01 | 1000 | 1000 | 1 | 1200 | 2 | 全剔除 0
| 商品A | 02 | 500 | 1500 | 2 | 1200 | 2 | 部分剔除 1500-1200
| 商品A | 03 | 200 | 1700 | 3 | 1200 | 2 | 保留 200
| 商品B | 01 | 1000 | 1000 | 1 | 200 | 1 | 部分剔除 1000-200
最终结果:
| 商品 | 批号 | 库存数量
| 商品A | 01 | 0
| 商品A | 02 | 300
| 商品A | 03 | 200
| 商品B | 01 | 800
按照你的剔除规则,写一个存过