现在我有张账本表  T_Account 
字段为: A(表示上月剩余金额)B(本月支出),C(表示本月剩余金额=A-B)D(日期都放每月的1号)
A       B      C       D 
1000   500    500    2009-2-1
500    200    300    2009-3-1 
300    100    200    2009-4-1
现在如果更新第一条记录的C字段话比如更新成为800  实际是B字段的数据做了修改改为200了 
这样就需要得到下面的结果 
A       B      C       D 
1000   200    800    2009-2-1
800    200    600    2009-3-1 
600    100    500    2009-4-1现在遇到的问题就是 有可能 C 字段可能会被更新,这样就影响到下月的A字段,和C字段 
所以想通过监视C字段的更新来更新之后月份的A和C的值不知道通过触发器能实现吗,大家帮忙指点下~ 

解决方案 »

  1.   

    我建议你这样A(收入)B(支出)  D (日期)
    1000  500      2009-2-1 
    500   200      2009-3-1 
    300   100      2009-4-1 
    1000  500      2009-2-2 
    500   200      2009-3-2 
    300   100      2009-4-2就是说每天都可以写入数据,然后通过SQL得到你要的查询即可.
     
    create table tb(A int, B int, D datetime)
    insert into tb values(1000 , 500 , '2009-2-1') 
    insert into tb values(500  , 200 , '2009-3-1') 
    insert into tb values(300  , 100 , '2009-4-1') 
    insert into tb values(1000 , 500 , '2009-2-2') 
    insert into tb values(500  , 200 , '2009-3-2') 
    insert into tb values(300  , 100 , '2009-4-2')
    go--每天的累计
    select D , A , B ,
           C = (select sum(A - B) from tb where d <= t.d)
    from tb t
    order by t.d
    /*
    D                       A           B           C
    ----------------------- ----------- ----------- -----------
    2009-02-01 00:00:00.000 1000        500         500
    2009-02-02 00:00:00.000 1000        500         1000
    2009-03-01 00:00:00.000 500         200         1300
    2009-03-02 00:00:00.000 500         200         1600
    2009-04-01 00:00:00.000 300         100         1800
    2009-04-02 00:00:00.000 300         100         2000(6 行受影响)
    */--每月的累计
    select convert(varchar(7),D ,120) D,
           sum(A) A,
           sum(B) B,
           C = (select sum(A -B) from tb where convert(varchar(7),D ,120) <= convert(varchar(7),t.D ,120))
    from tb t
    group by convert(varchar(7),D ,120)
    /*
    D       A           B           C
    ------- ----------- ----------- -----------
    2009-02 2000        1000        1000
    2009-03 1000        400         1600
    2009-04 600         200         2000(3 行受影响)
    */
    drop table tb