日期:2014-05-17  浏览次数:20593 次

高分请教:本条记录的余额=上条记录的余额+本条记录的收入+本条记录的支出,如何批量更新?
如图,假定这张表叫liushui,三个字段分别是收入,支出和余额。
其中只有第一条记录有余额的值,剩下的记录(不确定记录数量)都只有收入或支出数。
其中收入用正数记,支出用负数记。
本条记录的余额=上一条记录的余额+本条记录的收入数+本条记录的支出数。
求教一条语句,如何才能批量将剩下的记录中余额值更新出来?

------解决方案--------------------

with tb(a,b,c)as (
select 0,0,339480 union all
select 0,-10000,0 union all
select 0,-2627.4,0 union all
select 0,-30960,0 union all
select 0,-54244.6,0 union all
select 0,-2606,0 union all
select 0,-60000,0 union all
select 0,-10000,0 union all
select 0,-4000,0 union all
select 0,-22000,0 
),
tbb as(
select row_number() over (order by a)number,* from tb)
select sum(a.a+a.b)+(select top 1 c from tb) from tbb a,tbb b where a.number<=b.number 
group by b.number

------解决方案--------------------
先提供一个字段x(id或日期时间)以区分上一条和下一条
然后就是自乘

大意:
update tb
set fresult=b.fresult+a.finc-a.fdec
from tb a
left join tb b on a.x=b.x-1
where b.x not is null

不过,还得注意更新顺序,好像还是游标保险一点

------解决方案--------------------
如果表格只含有这3列,那么是没有办法计算的。
至少还需要一个排序列,能使表格内容出现唯一排序的,比如自增长的ID,时间列等。
如果有了上面的排序列,
那么你可以进行如下操作:
1.select 表格内容
2.再inner join 上这个表,计算所有早于这个当前数据行的收入支出余额。
3.各行的余额都为原始余额
4.计算各行余额差值

大致如下:
收入 支出        原始余额  被减值       真实余额
0    0        339480   0       原始余额-被减值
0    -10000   339480     -10000
0     -2627.4  339480     -12627.4
0     -30960   339480     -43587.4