求教个修改的问题

时间:2021-10-02 17:51:18
资源表a,请求表b,a的资源按时间顺序分配给b,
当a的资源>b的请求,a分配b的请求数,
当a的资源<b的请求,a分配a的资源数
____________处理前______________
资源表a:
物资    时间       数量
A       2013-1-1   1
A       2013-1-2   2
A       2013-1-3   3
B       2013-1-1   1
B       2013-1-3   1
请求表b:
物资    数量
A       4
B       3
____________处理后______________
资源表a:
物资    时间       数量
A       2013-1-3   2
分配表c:
物资    时间       数量
A       2013-1-1   1
A       2013-1-2   2
A       2013-1-3   1
B       2013-1-1   1
B       2013-1-3   1   

怎样用语句更新?谢过。

10 个解决方案

#1


a<b还比较简单,a>b不容易实现,需要游标或者循环搜索更新。

#2


资源表A,作为“资源表A”
新建一个 即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源  库存
A    6件
B    2件

每次资源入库或者出库时,修改一下 即时资源表AA
请求资源时,用 即时资源表AA做比对。
和进销存一个道理的。

#3


引用 1 楼 windy_smile 的回复:
a<b还比较简单,a>b不容易实现,需要游标或者循环搜索更新。

游标确实能实现,但不知游标的效率如何?最好能用语句批量处理。

#4


引用 2 楼 hgwyl1 的回复:
资源表A,作为“资源表A”
新建一个即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源  库存
A    6件
B    2件

每次资源入库或者出库时,修改一下即时资源表AA。
请求资源时,用即时资源表AA做比对。
和进销存一个道理的。

谢谢你的留言,但是好像没有看懂我的问题。
我的问题要求按照表b修改表a,比如表b里申请A物资4个,从表a的A物资的3行里分别提取1个、2个、1个到表c,最后剩下第3行的A物资2个(处理后);表b申请B物资3个,但表a只有B物资2个,所以全部提取到表c,最后表a没有剩下B物资(处理后)。
根据表b决定表a哪些记录(行)要被修改并剩下多少才是问题最难的部分。

#5


这个题真的没有办法吗?

#6


引用 4 楼 drsheldoncooper 的回复:
引用 2 楼 hgwyl1 的回复:资源表A,作为“资源表A”
新建一个即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源  库存
A    6件
B    2件

每次资源入库或者出库时,修改一下即时资源表AA。
请求资源时,用即时资源表AA做比对。
和进销存一个道理的。
谢谢你的留言,但是好像没有看懂我的问题。
我的问题要求按照……


好像意思是这样吧……应该没理解错……
所以建议你起一个新的表,作为“即时库存”。

难道资源A,现存为6,在出货的时候,有出货顺序么……?
申请出货4个,先出1号——再出2号的——再出3号的1个,剩余2个……?
有这样的要求……?

只管库存数,反馈结果回去不就好了?
一定需要按顺序来出货?

#7


引用 6 楼 hgwyl1 的回复:
好像意思是这样吧……应该没理解错……
所以建议你起一个新的表,作为“即时库存”。

难道资源A,现存为6,在出货的时候,有出货顺序么……?
申请出货4个,先出1号——再出2号的——再出3号的1个,剩余2个……?
有这样的要求……?

只管库存数,反馈结果回去不就好了?
一定需要按顺序来出货?

是的,实际的问题不同理论,不能只有一个汇总表。
比如资源有批次,一般都是先从早点批次的开始出,以免过有效期;又比如一种资源分几个地方摆放,就要指示人员每个地方提取多少资源......
这些只有一个汇总表是不足够的,还要有一个提取表,你就当作指示批次或者位置的表吧。其实我的系统也有汇总表,但那不是我要问的问题。

#8



create table a(a varchar(10), b datetime, c int)
create table b(a varchar(10), c int)

insert into a select 'A','2013-1-1',1 union all 
              select 'A','2013-1-2',2 union all 
              select 'A','2013-1-3',3 union all 
              select 'B','2013-1-1',1 union all 
              select 'B','2013-1-3',1

insert into y select 'A',4 union all
              select 'A',3

declare @x table (a varchar(10), b datetime, c int ,d int)
declare @y table (a varchar(10), c int)

insert into @x(a,b,c,d) select x.*,isnull(y.c,0) from x left join y on x.a=y.a order by x.a,x.b 
insert into @y select * from y

declare @a varchar(10),@sum int,@d int
update @x set @sum=case @a when a then @sum-@d else d end,
              @d=case when @sum>c then c else @sum end,
              d=@d,
              @a=a
               
select a,b,d from @x where d<>0

#9


表名有点乱,有的操作也不需要,更正

create table a(a varchar(10), b datetime, c int)
create table b(a varchar(10), c int)
 
insert into a select 'A','2013-1-1',1 union all 
              select 'A','2013-1-2',2 union all 
              select 'A','2013-1-3',3 union all 
              select 'B','2013-1-1',1 union all 
              select 'B','2013-1-3',1
 
insert into b select 'A',4 union all
              select 'B',3
 
declare @t table (a varchar(10), b datetime, c int ,d int)
 
insert into @t(a,b,c,d) select a.*,isnull(b.c,0) from a left join b on a.a=b.a order by a.a,a.b 
 
declare @a varchar(10),@sum int,@d int
update @t set @sum=case @a when a then @sum-@d else d end,
              @d=case when @sum>c then c else @sum end,
              d=@d,
              @a=a
                
select a,b,d from @t where d<>0

#10


引用 9 楼 windy_smile 的回复:
SQL code?1234567891011121314151617181920212223create table a(a varchar(10), b datetime, c int)create table b(a varchar(10), c int)  insert into a select 'A','2013-1-1',……

就是我要的效果,感谢!!!!

#1


a<b还比较简单,a>b不容易实现,需要游标或者循环搜索更新。

#2


资源表A,作为“资源表A”
新建一个 即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源  库存
A    6件
B    2件

每次资源入库或者出库时,修改一下 即时资源表AA
请求资源时,用 即时资源表AA做比对。
和进销存一个道理的。

#3


引用 1 楼 windy_smile 的回复:
a<b还比较简单,a>b不容易实现,需要游标或者循环搜索更新。

游标确实能实现,但不知游标的效率如何?最好能用语句批量处理。

#4


引用 2 楼 hgwyl1 的回复:
资源表A,作为“资源表A”
新建一个即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源  库存
A    6件
B    2件

每次资源入库或者出库时,修改一下即时资源表AA。
请求资源时,用即时资源表AA做比对。
和进销存一个道理的。

谢谢你的留言,但是好像没有看懂我的问题。
我的问题要求按照表b修改表a,比如表b里申请A物资4个,从表a的A物资的3行里分别提取1个、2个、1个到表c,最后剩下第3行的A物资2个(处理后);表b申请B物资3个,但表a只有B物资2个,所以全部提取到表c,最后表a没有剩下B物资(处理后)。
根据表b决定表a哪些记录(行)要被修改并剩下多少才是问题最难的部分。

#5


这个题真的没有办法吗?

#6


引用 4 楼 drsheldoncooper 的回复:
引用 2 楼 hgwyl1 的回复:资源表A,作为“资源表A”
新建一个即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源  库存
A    6件
B    2件

每次资源入库或者出库时,修改一下即时资源表AA。
请求资源时,用即时资源表AA做比对。
和进销存一个道理的。
谢谢你的留言,但是好像没有看懂我的问题。
我的问题要求按照……


好像意思是这样吧……应该没理解错……
所以建议你起一个新的表,作为“即时库存”。

难道资源A,现存为6,在出货的时候,有出货顺序么……?
申请出货4个,先出1号——再出2号的——再出3号的1个,剩余2个……?
有这样的要求……?

只管库存数,反馈结果回去不就好了?
一定需要按顺序来出货?

#7


引用 6 楼 hgwyl1 的回复:
好像意思是这样吧……应该没理解错……
所以建议你起一个新的表,作为“即时库存”。

难道资源A,现存为6,在出货的时候,有出货顺序么……?
申请出货4个,先出1号——再出2号的——再出3号的1个,剩余2个……?
有这样的要求……?

只管库存数,反馈结果回去不就好了?
一定需要按顺序来出货?

是的,实际的问题不同理论,不能只有一个汇总表。
比如资源有批次,一般都是先从早点批次的开始出,以免过有效期;又比如一种资源分几个地方摆放,就要指示人员每个地方提取多少资源......
这些只有一个汇总表是不足够的,还要有一个提取表,你就当作指示批次或者位置的表吧。其实我的系统也有汇总表,但那不是我要问的问题。

#8



create table a(a varchar(10), b datetime, c int)
create table b(a varchar(10), c int)

insert into a select 'A','2013-1-1',1 union all 
              select 'A','2013-1-2',2 union all 
              select 'A','2013-1-3',3 union all 
              select 'B','2013-1-1',1 union all 
              select 'B','2013-1-3',1

insert into y select 'A',4 union all
              select 'A',3

declare @x table (a varchar(10), b datetime, c int ,d int)
declare @y table (a varchar(10), c int)

insert into @x(a,b,c,d) select x.*,isnull(y.c,0) from x left join y on x.a=y.a order by x.a,x.b 
insert into @y select * from y

declare @a varchar(10),@sum int,@d int
update @x set @sum=case @a when a then @sum-@d else d end,
              @d=case when @sum>c then c else @sum end,
              d=@d,
              @a=a
               
select a,b,d from @x where d<>0

#9


表名有点乱,有的操作也不需要,更正

create table a(a varchar(10), b datetime, c int)
create table b(a varchar(10), c int)
 
insert into a select 'A','2013-1-1',1 union all 
              select 'A','2013-1-2',2 union all 
              select 'A','2013-1-3',3 union all 
              select 'B','2013-1-1',1 union all 
              select 'B','2013-1-3',1
 
insert into b select 'A',4 union all
              select 'B',3
 
declare @t table (a varchar(10), b datetime, c int ,d int)
 
insert into @t(a,b,c,d) select a.*,isnull(b.c,0) from a left join b on a.a=b.a order by a.a,a.b 
 
declare @a varchar(10),@sum int,@d int
update @t set @sum=case @a when a then @sum-@d else d end,
              @d=case when @sum>c then c else @sum end,
              d=@d,
              @a=a
                
select a,b,d from @t where d<>0

#10


引用 9 楼 windy_smile 的回复:
SQL code?1234567891011121314151617181920212223create table a(a varchar(10), b datetime, c int)create table b(a varchar(10), c int)  insert into a select 'A','2013-1-1',……

就是我要的效果,感谢!!!!