这种扣减如何用sql查询出来。。

dg831451 2018-10-25 11:34:07
这个就是这样的,比如下图。99200 这个商品在6个订单中都有这个需求,订单的总需求是15个,假如99200这个商品的库存目前只有12个,那么当它分配给订单ID为2518490后。都会少一个,所以将所有剩下的全分给它,后面的两个订单就没有了。而且排在这个订单后面的这个商品也全部返回0,

目前这个顺序是不能修改的。因为业务中,比如按客户付的钱,以及下单时间,还有这个货物到客户地址的时间来排序出来的,所以这个顺序不能修改了。。(也就是一个商品在隔了很多行出现,这时候还是要用这个商品剩下的库存来减订单的需求量)一直到小于等于0后。。。全返回0


如下图。这个99200商品在不同的行中出现。顺序不能修改

库存可分配数量 这一列是我手工弄出来的。。。现在就是想在数据查询中如何将这个库存可分配数量这列数据求出来。。。


...全文
178 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dg831451 2018-10-25
  • 打赏
  • 举报
回复
引用 5 楼 nayi_224 的回复:
[quote=引用 4 楼 dg831451 的回复:]
[quote=引用 3 楼 nayi_224 的回复:]
[quote=引用 2 楼 dg831451 的回复:]
[quote=引用 1 楼 nayi_224 的回复:]
sum over


这个具体怎么来实现呀。。。。请帮忙一下。。这个真的太难了。。[/quote]

with tab1 as (
select 4 num, 1 bus_id, 1 id from dual union all
select 1 num, 1 bus_id, 2 id from dual union all
select 1 num, 1 bus_id, 3 id from dual union all
select 7 num, 1 bus_id, 4 id from dual union all
select 1 num, 1 bus_id, 5 id from dual union all
select 1 num, 1 bus_id, 6 id from dual
)
select t1.*,
case
when 12 > sum(t1.num) over(partition by t1.bus_id order by id) then
t1.num
when 12 <= sum(t1.num) over(partition by t1.bus_id order by id)
and sum(t1.num) over(partition by t1.bus_id order by id) - t1.num < 12 then
12 - (sum(t1.num) over(partition by t1.bus_id order by id) - t1.num)
else
0
end ddddd
from tab1 t1;[/quote]


谢谢。这样测试是可以。但是这样会按商品id排序了。。但是我的同一个商品并不是连续在一起的。。。。。如果又按商品ID排序后来这样计算,那么,可能库存在分配的时候就会出错了。。比如A与B客户同时购买了 99200这个商品。但是A客户的订单总共是3万。B客户是1万元。那么我们会先向A客户配货。。。。
[/quote]

所有的order by id改成order by 时间[/quote]


大佬厉害了。。目前测试没有发现问题。好像是正确的。。。我再测试一天。我过二天来结贴。。我还需要在真实数据中测试。并且让业务看一下。我目前测试好像没有问题。。
nayi_224 2018-10-25
  • 打赏
  • 举报
回复
引用 4 楼 dg831451 的回复:
[quote=引用 3 楼 nayi_224 的回复:] [quote=引用 2 楼 dg831451 的回复:] [quote=引用 1 楼 nayi_224 的回复:] sum over
这个具体怎么来实现呀。。。。请帮忙一下。。这个真的太难了。。[/quote] with tab1 as ( select 4 num, 1 bus_id, 1 id from dual union all select 1 num, 1 bus_id, 2 id from dual union all select 1 num, 1 bus_id, 3 id from dual union all select 7 num, 1 bus_id, 4 id from dual union all select 1 num, 1 bus_id, 5 id from dual union all select 1 num, 1 bus_id, 6 id from dual ) select t1.*, case when 12 > sum(t1.num) over(partition by t1.bus_id order by id) then t1.num when 12 <= sum(t1.num) over(partition by t1.bus_id order by id) and sum(t1.num) over(partition by t1.bus_id order by id) - t1.num < 12 then 12 - (sum(t1.num) over(partition by t1.bus_id order by id) - t1.num) else 0 end ddddd from tab1 t1;[/quote] 谢谢。这样测试是可以。但是这样会按商品id排序了。。但是我的同一个商品并不是连续在一起的。。。。。如果又按商品ID排序后来这样计算,那么,可能库存在分配的时候就会出错了。。比如A与B客户同时购买了 99200这个商品。但是A客户的订单总共是3万。B客户是1万元。那么我们会先向A客户配货。。。。 [/quote] 所有的order by id改成order by 时间
dg831451 2018-10-25
  • 打赏
  • 举报
回复
引用 3 楼 nayi_224 的回复:
[quote=引用 2 楼 dg831451 的回复:]
[quote=引用 1 楼 nayi_224 的回复:]
sum over


这个具体怎么来实现呀。。。。请帮忙一下。。这个真的太难了。。[/quote]

with tab1 as (
select 4 num, 1 bus_id, 1 id from dual union all
select 1 num, 1 bus_id, 2 id from dual union all
select 1 num, 1 bus_id, 3 id from dual union all
select 7 num, 1 bus_id, 4 id from dual union all
select 1 num, 1 bus_id, 5 id from dual union all
select 1 num, 1 bus_id, 6 id from dual
)
select t1.*,
case
when 12 > sum(t1.num) over(partition by t1.bus_id order by id) then
t1.num
when 12 <= sum(t1.num) over(partition by t1.bus_id order by id)
and sum(t1.num) over(partition by t1.bus_id order by id) - t1.num < 12 then
12 - (sum(t1.num) over(partition by t1.bus_id order by id) - t1.num)
else
0
end ddddd
from tab1 t1;[/quote]


谢谢。这样测试是可以。但是这样会按商品id排序了。。但是我的同一个商品并不是连续在一起的。。。。。如果又按商品ID排序后来这样计算,那么,可能库存在分配的时候就会出错了。。比如A与B客户同时购买了 99200这个商品。但是A客户的订单总共是3万。B客户是1万元。那么我们会先向A客户配货。。。。
nayi_224 2018-10-25
  • 打赏
  • 举报
回复
引用 2 楼 dg831451 的回复:
[quote=引用 1 楼 nayi_224 的回复:] sum over
这个具体怎么来实现呀。。。。请帮忙一下。。这个真的太难了。。[/quote] with tab1 as ( select 4 num, 1 bus_id, 1 id from dual union all select 1 num, 1 bus_id, 2 id from dual union all select 1 num, 1 bus_id, 3 id from dual union all select 7 num, 1 bus_id, 4 id from dual union all select 1 num, 1 bus_id, 5 id from dual union all select 1 num, 1 bus_id, 6 id from dual ) select t1.*, case when 12 > sum(t1.num) over(partition by t1.bus_id order by id) then t1.num when 12 <= sum(t1.num) over(partition by t1.bus_id order by id) and sum(t1.num) over(partition by t1.bus_id order by id) - t1.num < 12 then 12 - (sum(t1.num) over(partition by t1.bus_id order by id) - t1.num) else 0 end ddddd from tab1 t1;
dg831451 2018-10-25
  • 打赏
  • 举报
回复
引用 1 楼 nayi_224 的回复:
sum over


这个具体怎么来实现呀。。。。请帮忙一下。。这个真的太难了。。
nayi_224 2018-10-25
  • 打赏
  • 举报
回复
sum over

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧