我有一张数据表,里面的记录是死了的,只不过每条记录的数据通过UPDATE来改变,比如:
数据编号  数据项目  数据值1  数据值2  数据值3  平均值  累计值
   1       safd        2        5.6     7.8                  
总共有上百条这样的记录,而各数据项目的三个数据值都是通过各种统计后所得的数值,现在要再对这些数据值算平均值放到平均值字段来,而累计值是这一次的平均值加上上一次的平均值,思路是这样的,我目前采用的是这种程序,但速度相当慢,而且我想放到存储过程实现,可老是说do附近语法有错!请各位同行帮帮忙,看看怎么做会更好一些呢?
这是我在DELPHI中直接编的代码,但速度不行,太慢了,而且也不灵活,因为我直接指定了编号值,不方便以后增加数据,若把这种改到存储过程又怎么改呢?或者有更好的算法!请高手指点!
     for x := 1 to 79  do
      begin
           i := inttostr(x);
           ADOQ_bfc.Close;
           ADOQ_bfc.SQL.Clear;
           ADOQ_bfc.SQL.Text := 'update bfcb set sbsj=(qq.a+qq.b+qq.c)/3 from (select a=jbsj,b=ybsj,c=bbsj from bfcb where phid = '''+i+''') as qq where bfcb.phid = '''+i+'''';
           ADOQ_bfc.ExecSQL;           ADOQ_bfc.Close;
           ADOQ_bfc.SQL.Clear;
           ADOQ_bfc.SQL.Text := 'update bfcb set sjlj=(bfcb.sbsj+w.b)/w.c from (select phid,b=sum(sbsj),c=count(sbsj) from bfbfcb  group by phid) as w where w. phid = bfcb.phid and bfcb.phid='''+i+'''';
           ADOQ_bfc.ExecSQL;
      end;

解决方案 »

  1.   

    1.查询分析器分析你SQL的性能.
    2.SQL批量执行,不要一条一条执行.
    3.也可以考虑用存储过程了
      

  2.   

    if object_id(N't1') is not null
    drop table t1create table t1
    (
    FID int identity(1,1),
    FName varchar(20),
    FData1 numeric(10,2),
    FData2 numeric(10,2),
    FData3 numeric(10,2),
    FAvg numeric(10,2),
    FSum numeric(10,2)
    )
    goinsert into T1 values('s',1,2,3,2,0)
    insert into T1 values('d',2,3,4,3,0)
    insert into T1 values('f',3,4,5,4,0)
    go--创建函数实现对三个字段的平均值计算
    if object_id(N'F_GetAvg') is not null
    drop function f_getAvg
    gocreate function f_getAvg (@id int)
    returns numeric(10,2)
    as
    begin
      declare @FResult numeric(10,2)
      select @FResult = (isnull(FData1,0)+isnull(FData2,0)+isnull(FData3,0))/3 
      from t1 where FID = @Id
      return @FResult
    endgoselect * from t1--更新平均值;并返回更新后数据结果
    update t1 set FSum = isnull(FSum,0)+dbo.f_getAvg(Fid) + FAvg, FAvg = dbo.f_getAvg(Fid)
    select * from t1
      

  3.   

    if object_id(N't1') is not null
    drop table t1create table t1
    (
    FID int identity(1,1),
    FName varchar(20),
    FData1 numeric(10,2),
    FData2 numeric(10,2),
    FData3 numeric(10,2),
    FAvg numeric(10,2),
    FSum numeric(10,2)
    )
    go--插入测试数据
    insert into T1(FName,FData1,FData2,FData3) 
    select top 1000 '1', abs(checksum(newid()) % 1000),
     abs(checksum(newid()) % 1000),
     abs(checksum(newid()) % 1000)
    from syscolumnsgo--创建函数实现对三个字段的平均值计算
    if object_id(N'F_GetAvg') is not null
    drop function f_getAvg
    gocreate function f_getAvg (@id int)
    returns numeric(10,2)
    as
    begin
      declare @FResult numeric(10,2)
      select @FResult = (isnull(FData1,0)+isnull(FData2,0)+isnull(FData3,0))/3 
      from t1 where FID = @Id
      return @FResult
    endgoselect * from t1--更新平均值;并返回更新后数据结果
    update t1 set FSum = isnull(FSum,0)+dbo.f_getAvg(Fid) + isnull(FAvg,0), FAvg = dbo.f_getAvg(Fid)
    select * from t1----------------------------------
    如上所述的语句总计执行时间0.0563s