除了用游标,应该怎样写SQL语句?
各位大哥,现有两个临时表AA1、AA2,AA1的内容是:
编号 批次 库存 最大库存量 需补量
001 A0001 10 100 90
002 B0001 20 200 180
003 C0001 30 300 270
AA2的内容是:
编号 批次 库存
001 A0002 50
001 A0003 10
001 A0004 100
001 A0005 200
002 B0002 200
003 C0002 100
003 C0003 50
003 C0004 200
除了用游标,可以怎样写SQL语得到以下的结果?
编号 批次 库存 实补量
001 A0002 50 50
001 A0003 10 10
001 A0004 100 30
002 B0002 200 180
003 C0002 100 100
003 C0003 50 50
003 C0004 200 120
------解决方案--------------------实补量 咋算的?
------解决方案--------------------create table AA1(id varchar(10),p_id varchar(10),inv int,max_inv int, need int)
insert into AA1 select '001','A0001',10,100,90
insert into AA1 select '002','B0001',20,200,180
insert into AA1 select '003','C0001',30,300,270
create table AA2(id varchar(10),p_id varchar(10),inv int)
insert into AA2 select '001','A0002',50
insert into AA2 select '001','A0003',10
insert into AA2 select '001','A0004',100
insert into AA2 select '001','A0005',200
insert into AA2 select '002','B0002',200
insert into AA2 select '003','C0002',100
insert into AA2 select '003','C0003',50
insert into AA2 select '003','C0004',200
select tmp=identity(int,1,1) ,*,act=0 into #t from AA2 order by id,p_id
update A
set act=case when isnull((select sum(inv) from #t where tmp<=A.tmp and id=A.id),0)<=isnull(B.need,0)
then A.inv
else case when isnull((select sum(inv) from #t where tmp<A.tmp and id=A.id),0)>=isnull(B.need,0)
then 0
else isnull(B.need,0)-isnull((select sum(inv) from #t where tmp<A.tmp and id=A.id),0) end
end
from #t A,AA1 B
where A.id=B.id
select id,p_id,inv,act from #t where act>0
/*
id p_id inv act
---------- ---------- ----------- -----------
001 A0002 50 50
001 A0003 10 10
001 A0004 100 30
002 B0002 200 180
003 C0002 100 100
003 C0003 50 50
003 C0004 200 120
*/
drop table AA1,AA2,#t
------解决方案--------------------是啊。兄弟,具体点,这样才好回答啊。
------解决方案----------------------直接select
select * from
(
select A.id,A.p_id,A.inv,
case when isnull((select sum(inv) from AA2 where id=A.id and p_id<=A.p_id),0)<=isnull(B.need,0)
then A.inv
else case when isnull((select sum(inv) from AA2 where p_id<A.p_id and id=A.id),0)>=isnull(B.need,0)
then 0
else isnull(B.need,0)-isnull((select sum(inv) from AA2 where p_id<A.p_id and id=A.id),0) end
end as act
from AA2 A,AA1 B
where A.id=B.id
) T
where act>0
/*
id p_id inv act
---------- ---------- ----------- -----------
001 A0002 50 50
001 A0003 10 10
001 A0004 100 30
002 B0002 200 180
003 C0002 100 100
003 C0003 50 50