求根据上一列的数据计算下一数的值的SQL
select * into # from (
select
'QRD121008401'出入库单号,'2012-10-28'单据日期,'S565840A0'存货编码,'男长袖衬衫'存货名称,'43/17.4'尺码,0 上存数量,1 入库数量,0 出库合计,0 结存数量,1 ID union all select
'QRD121009006','2012-10-28','S565840A0','男长袖衬衫','43/17.4',1,2,0,0,2 union all select
'XSC121010041','2012-10-18','G4046A0','羽绒服','50',2,0,1,1,3 union all select
'XSC121014219','2012-10-28','G4046A0','羽绒服','50',1,0,1,0,4 union all select
'QCD121008150','2012-10-26','G4046A0','羽绒服','52',2,0,1,1,5 union all select
'XSC121000678','2012-10-01','G4046A0','羽绒服','54',1,0,1,0,6
) a
select * from #
----以上是测试数据
--这我的写法,可是结存数量这一列不一样.
select
出入库单号,单据日期,存货编码,存货名称,尺码
,上存数量=isnull((select top 1 上存数量 from # WHERE 单据日期=t.单据日期 and 存货编码=t.存货编码 and 尺码=t.尺码 order by ID)
-(select sum(出库合计) from # where 单据日期=t.单据日期 and 存货编码=t.存货编码 and 尺码=t.尺码 and iD<t.ID),上存数量)
,入库数量,出库合计
,结存数量=(select top 1 上存数量+t.入库数量 from # where 单据日期=t.单据日期 and 存货编码=t.存货编码 and 尺码=t.尺码 order by ID)
-(select sum(出库合计) from # where 单据日期=t.单据日期 and 存货编码=t.存货编码 and 尺码=t.尺码 and ID<=t.ID)
,ID
from # t
go
----以下是我的结果
出入库单号 单据日期 存货编码 存货名称 尺码 上存数量 入库数量 出库合计 结存数量 ID
------------ ---------- --------- ---------- ------- ----------- ----------- ----------- ----------- -----------
QRD121008401 2012-10-28 S565840A0 男长袖衬衫 43/17.4 0 1 0 1 1
QRD121009006 2012-10-28 S565840A0 男长袖衬衫 43/17.4 0 2 0 2 2
XSC121010041 2012-10-18 G4046A0 羽绒服 50 2 0 1 1 3
XSC121014219 2012-10-28 G4046A0 羽绒服 50 1 0 1 0 4
QCD121008150 2012-10-26 G4046A0 羽绒服 52 2 0 1 1 5
XSC121000678 2012-10-01 G4046A0 羽绒服 54 1 0 1 0 6
(6 行受影响)
----------我需要的算法是这样:
上存数量+入库数量-出库合计=结存数量
当下一行的 单据日期 ,存货编码,尺码 与上一行的 相等时,将上一行的结存数量作为下一行的上存数量,再依次累加
--以下是我想要的结果:
出入库单号 单据日期 存货编码 存货名称 尺码 上存数量 入库数量 出库合计 结存数量 ID
------------ ---------- --------- ---------- ------- ----------- ----------- ----------- ----------- -----------
QRD121008401 2012-10-28 S565840A0 男长袖衬衫 43/17.4 0 1 0 1 1
QRD121009006 2012-10-28 S565840A0 男长袖衬衫 43/17.4 1 2 0 3 2
XSC121010041 2012-10-18 G4046A0 羽绒服 50 2 0 1 1 3
XSC121014219 2012-10-28 G4046A0 羽绒服 50 1 0 1 0 4
QCD121008150 2012-10-26 G4046A0 羽绒服 52 2 0 1 1 5
XSC121000678 2012-10-01 G4046A0 羽绒服 54 1 0 1 0 6
--this?
select *,
结存数量 = 上存数量 + 入库数量 - 出库合计
from
(
select 出入库单号,单据日期,存货编码,存货名称,尺码 ,
上存数量=(select top 1 上存数量 from # WHERE 单据日期=t.单据日期 and 存货编码=t.存货编码 and 尺码=t.尺码 order by ID) + isnull((select sum(入库数量-出库合计) from # where 单据日期=t.单据日期 and 存货编码=t.存货编码 and 尺码=t.尺码 and iD<t.ID),0) ,
入库数量,出库合计
from # t
) tt
select 出入库单号,单据日期,存货编码,存货名称,尺码,
(case (select count(结存数量) from # where #.单据日期=tt.单据日期 and 存货编码=tt.存货编码 and 尺码=tt.尺码 and ID<tt.ID)
when 0 then 0 else (select top 1 结存数量 from # where #.单据日期=tt.单据日期 and 存货编码=tt.存货编码 and 尺码=tt.尺码 and ID<tt.ID order by ID desc)end) as 上存数量
,入库数量,出库合计,(上存数量+入库数量-出库合计)as 结存数量,ID from # tt
出入库单号 单据日期 存货编码 存货名称 尺码 上存数量 入库数量 出库合计 结存数量 ID
------------ ---------- --------- ---------- ------- ----------- ----------- ----------- ----------- -----------
QRD121008401 2012-10-28 S565840A0 男长袖衬衫 43/17.4 0 1 0 1 1
QRD121009006 2012-10-28 S565840A0 男长袖衬衫 43/17.4 1 2 0 3 2
XSC121010041 2012-10-18 G4046A0 羽绒服 50 2 0 1 1 3
XSC121014219 2012-10-28 G4046A0 羽绒服 50 1 0 1 0 4
QCD121008150 2012-10-26 G4046A0 羽绒服 52 2 0 1 1 5
XSC121000678 2012-10-01 G4046A0 羽绒服 54 1 0 1 0 6
select 出入库单号,单据日期,存货编码,存货名称,尺码,
isnull((select top 1 结存数量 from # where #.单据日期=tt.单据日期 and 存货编码=tt.存货编码 and 尺码=tt.尺码 and ID<tt.ID order by ID desc),0)as上存数量
,入库数量,出库合计,(上存数量+入库数量-出库合计)as 结存数量,ID from # tt