首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求根据下一列的数据计算上一数的值的SQL

2012-12-20 
求根据上一列的数据计算下一数的值的SQLselect * into # from (select QRD121008401出入库单号,2012-10

求根据上一列的数据计算下一数的值的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


[其他解释]
用isnull果然更简单
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

热点排行