当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做比对。
和进销存一个道理的。
新建一个 即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源 库存
A 6件
B 2件
每次资源入库或者出库时,修改一下 即时资源表AA。
请求资源时,用 即时资源表AA做比对。
和进销存一个道理的。
#3
游标确实能实现,但不知游标的效率如何?最好能用语句批量处理。
#4
谢谢你的留言,但是好像没有看懂我的问题。
我的问题要求按照表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
好像意思是这样吧……应该没理解错……
所以建议你起一个新的表,作为“即时库存”。
难道资源A,现存为6,在出货的时候,有出货顺序么……?
申请出货4个,先出1号——再出2号的——再出3号的1个,剩余2个……?
有这样的要求……?
只管库存数,反馈结果回去不就好了?
一定需要按顺序来出货?
#7
是的,实际的问题不同理论,不能只有一个汇总表。
比如资源有批次,一般都是先从早点批次的开始出,以免过有效期;又比如一种资源分几个地方摆放,就要指示人员每个地方提取多少资源......
这些只有一个汇总表是不足够的,还要有一个提取表,你就当作指示批次或者位置的表吧。其实我的系统也有汇总表,但那不是我要问的问题。
#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
就是我要的效果,感谢!!!!
#1
a<b还比较简单,a>b不容易实现,需要游标或者循环搜索更新。
#2
资源表A,作为“资源表A”
新建一个 即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源 库存
A 6件
B 2件
每次资源入库或者出库时,修改一下 即时资源表AA。
请求资源时,用 即时资源表AA做比对。
和进销存一个道理的。
新建一个 即时资源表AA
汇总上述(处理前的)资源表A,可以得到如下结果
资源 库存
A 6件
B 2件
每次资源入库或者出库时,修改一下 即时资源表AA。
请求资源时,用 即时资源表AA做比对。
和进销存一个道理的。
#3
游标确实能实现,但不知游标的效率如何?最好能用语句批量处理。
#4
谢谢你的留言,但是好像没有看懂我的问题。
我的问题要求按照表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
好像意思是这样吧……应该没理解错……
所以建议你起一个新的表,作为“即时库存”。
难道资源A,现存为6,在出货的时候,有出货顺序么……?
申请出货4个,先出1号——再出2号的——再出3号的1个,剩余2个……?
有这样的要求……?
只管库存数,反馈结果回去不就好了?
一定需要按顺序来出货?
#7
是的,实际的问题不同理论,不能只有一个汇总表。
比如资源有批次,一般都是先从早点批次的开始出,以免过有效期;又比如一种资源分几个地方摆放,就要指示人员每个地方提取多少资源......
这些只有一个汇总表是不足够的,还要有一个提取表,你就当作指示批次或者位置的表吧。其实我的系统也有汇总表,但那不是我要问的问题。
#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
就是我要的效果,感谢!!!!