update mytable
set fieldB=(select sum(fieldA) 
            from mytable t1  
            where t1.fieldA<=mytable.fieldA)

解决方案 »

  1.   

    icevi(按钮工厂) 的恐怕不太好用,如果A有相同的就不行了declare @i int
    set @i=0
    update mytable set B=@i,@i=@i+A
      

  2.   

    j9988(j9988) 的方法不错。不过说实话,这样的问题我总觉得贴主就没说清楚,因为行的顺序规律不清楚,所以我只有假设是按FIELDA的大小来排序了。按理这样的表应该有一个primary key或unique,不太可能就是这样的一个表来做这样的累加。
      

  3.   

    to:  icevi(按钮工厂) :
    我曾经碰到一个问题,就以此贴为例吧,请看下面语句:
    --1
    declare @mytable table (A int,B int)
    insert @mytable(a) values(10)
    insert @mytable(a) values(12)
    insert @mytable(a) values(14)
    insert @mytable(a) values(15)
    insert @mytable(a) values(16)
    update @mytable set b=
    (select sum(a) from @mytable t1 where t1.a<[email protected])--2
    create table #mytable (A int,B int)
    insert #mytable(a) values(10)
    insert #mytable(a) values(12)
    insert #mytable(a) values(14)
    insert #mytable(a) values(15)
    insert #mytable(a) values(16)
    update #mytable set b=
    (select sum(a) from #mytable t1 where t1.a<=#mytable.a)
    drop table #mytable2通过,1提示“必须声明变量@mytable” 
    问题在:where t1.a<=#mytable.a 
    是什么原因?是不是又是SP2 ?
      

  4.   

    我也发现过类似的问题,应该不是BUG,可能是因为表变量的应用是受限制的。我不太记得以前出现这样的问题是怎么样的,好象是不能用@mytable.a这样的语句,一定要给它起个别名后再来引用,改成下面这样就可以了:
    update @mytable set b=
    (select sum(a) from @mytable t1 where t1.a<=t2.a)
    from @mytable t2比如以下的语句也不行:
    create....
    insert....同上
    select @mytable.a ,sysobjects.* from @mytable,sysobjects改成这样就好了:
    select t1.a ,sysobjects.* from @mytable t1,sysobjects
      

  5.   

    我是有个主键我现在把j9988(j9988)的方法改造了一下:
    CREATE TRIGGER SetDELETE ON [土地利用计划核算管理] 
    FOR DELETE 
    AS
    declare @i float
    declare @j float
    declare @year intset @year= (select 年代 from deleted)set @i=(select 建设项目占用农田地面积 from 土地利用年度计划管理 where 年代 = @year)
    set @j=(select 建设项目占用耕地面积 from 土地利用年度计划管理 where 年代 = @year)update 土地利用计划核算管理 set @i=@i-使用农用地面积,剩余农用地面积=@i,@j=@j-使用耕地面积,剩余耕地面积=@j where 年代 = @year
    却出现“Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    The statement has been terminated.”的错误但是写insert和update的触发器却没有问题只是把“set @year= (select 年代 from deleted)”改为“set @year= (select 年代 from inserted)”请问是什么原因
      

  6.   

    set @i=(select 建设项目占用农田地面积 from 土地利用年度计划管理 where 年代 = @year)
    set @j=(select 建设项目占用耕地面积 from 土地利用年度计划管理 where 年代 = @year)
    返回值多于一个,可能要用SUM:
    set @i=(select sum(建设项目占用农田地面积) from 土地利用年度计划管理 where 年代 = @year)
    set @j=(select sum(建设项目占用耕地面积) from 土地利用年度计划管理 where 年代 = @year)
      

  7.   

    不对阿,我怎么看不懂@i和@j是不需要求和的阿,每年计划就一条记录而已,再说我print @i和@j了,取值没有错,是最后一句update出错,换句话说,没有最后一句update,这个触发器没有任何问题。
      

  8.   

    CREATE TRIGGER SetDELETE ON [土地利用计划核算管理] 
    FOR insert 
    AS
    declare @i float
    declare @j float
    declare @year intset @year= (select 年代 from deleted)
    ---如果存在数据,修改
      update b set 建设项目占用农田地面积 =a.建设项目占用农田地面积 +b.建设项目占用农田地面积  from select sum(建设项目占用农田地面积 )as 建设项目占用农田地面积 ,年代  from inserted group by 年代 ) a join b on a.年代 =b.年代  
    --如果没有,插入
    insert into b(建设项目占用农田地面积 ,年代)
    select sum(建设项目占用农田地面积 )as 建设项目占用农田地面积 ,年代  from inserted a left join b on a.年代 =b.年代 
    where b.年代 is null
    group by a.年代