declare @ta table(id int,入数量 int,入单价 int ,出数量 int,出单价 int,结存数 int,结存金额 int) 
insert @ta select 1,0,0,0,0,20,30 
union all select 2,3,6,5,6,0,0 
union all select 3,5,6,6,7,0,0
union all select 4,5,3,7,8,0,0
union all select 5,5,2,0,2,0,0 select * from @ta 
/*--上面是测试环境已建好
实现功能:更新所有的结存数量+金额列.
要    求:1条Update语句,不使用辅助变量
*/之前的一贴没把表贴出来,其实就是现在这张表,疑惑在于:一个UPDATE中不能完全通过上一行来计算。
http://topic.csdn.net/u/20091226/16/e876be18-9327-481c-9d32-a92b76547e14.html?seed=924913734&r=62243824#r_62243824

解决方案 »

  1.   

    declare @tB table(id int,入数量 int,入单价 int ,出数量 int,出单价 int,结存数 int,结存金额 int) 
    insert @tB select 1,0,0,0,0,20,30 
    union all select 2,3,6,5,6,0,0 
    union all select 3,5,6,6,7,0,0 
    union all select 4,5,3,7,8,0,0 
    union all select 5,5,2,0,2,0,0 
    UPDATE B 
    SET 
    结存数=(SELECT SUM(结存数+入数量-出数量) FROM @TB  WHERE ID<=B.ID),
    结存金额=(SELECT SUM(结存金额+(入数量*入单价-出数量*出单价)) FROM @TB  WHERE ID<=B.ID) FROM @TB BSELECT * FROM @TB
    (所影响的行数为 5 行)
    (所影响的行数为 5 行)id          入数量         入单价         出数量         出单价         结存数         结存金额        
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    1           0           0           0           0           20          30
    2           3           6           5           6           18          18
    3           5           6           6           7           17          6
    4           5           3           7           8           15          -35
    5           5           2           0           2           20          -25(所影响的行数为 5 行)???
      

  2.   

    最好要用ISNULL判断是否为NULL,
      

  3.   

    UPDATE A 
    SET 结存数=(B.结存数+A.入数量-A.出数量),
    结存金额=(B.结存金额+A.入数量*A.入单价-A.出数量*A.出单价)
    FROM @ta A,@ta B
    WHERE A.ID=B.ID+1我主要是不明白:
    ...TNND,我上面这句为什么只有第二行刷成了...后面的都不成...要么他丫就一个不成还好理解一些..
    呵呵。楼上各位,谢谢回贴。
      

  4.   

    我只是想求证,咋在UPDATE时通过上一行的值来计算出下一行的值...A.ID=B.ID+1,如上...大师来解惑啊。
    ..
    折腾了半天才说明白...我的语言表达真的出问题了。
      

  5.   

    ta a                            ta b
    id                              id
    1                                Null
    2                               1
    3                               2...
      

  6.   

    declare @ta table(id int,入数量 int,入单价 int ,出数量 int,出单价 int,结存数 int,结存金额 int) 
    insert @ta select 1,0,0,0,0,20,30 
    union all select 2,3,6,5,6,0,0 
    union all select 3,5,6,6,7,0,0 
    union all select 4,5,3,7,8,0,0 
    union all select 5,5,2,0,2,0,0 --查询
    select id ,入数量 ,入单价 ,出数量 ,出单价,
           结存数 =(select sum(结存数 + 入数量 - 出数量) from @ta where id <= t.id),
           结存金额 = (select sum(结存金额 + 入数量*入单价 - 出数量*出单价) from @ta where id <= t.id)
    from @ta  t
    /*
    id          入数量         入单价         出数量         出单价         结存数         结存金额        
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    1           0           0           0           0           20          30
    2           3           6           5           6           18          18
    3           5           6           6           7           17          6
    4           5           3           7           8           15          -35
    5           5           2           0           2           20          -25(所影响的行数为 5 行)*/--更新
    update @ta
    set    结存数 =(select sum(结存数 + 入数量 - 出数量) from @ta where id <= t.id),
           结存金额 = (select sum(结存金额 + 入数量*入单价 - 出数量*出单价) from @ta where id <= t.id)
    from @ta  tselect * from @ta
    /*
    id          入数量         入单价         出数量         出单价         结存数         结存金额        
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    1           0           0           0           0           20          30
    2           3           6           5           6           18          18
    3           5           6           6           7           17          6
    4           5           3           7           8           15          -35
    5           5           2           0           2           20          -25(所影响的行数为 5 行)
    */