我有一张数据表,里面的记录是死了的,只不过每条记录的数据通过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 数据值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;
2.SQL批量执行,不要一条一条执行.
3.也可以考虑用存储过程了
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
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