字段1 字段2
 54
 26
 15
 57
  .
  .
  .
 69
 36
 87
 95
 28      63
如上面的这个表,数据是在不断增加的,不断计算字段1最后5个的平均值,并将平均值添加到字段2的最后一个记录。SQL语句应该怎样写。我在DELPHI里用。请各位大虾赐教。

解决方案 »

  1.   

    假设你的表tb有3个字段:fid(自动递增),f1,f2
    你的插入语句是:insert tb (f1) values (xxx)
    改为:
    declare @id int,@d int
    insert tb (f1) values (xxx)
    set @id=scope_identity()
    select @d=sum(f1) from (
      select top 5 f1 from tb
      order by fid desc
    )
    update tb set f2=@d/5 where fid=@id
      

  2.   

    最后2行
    )
    update tb set f2=@d/5 where fid=@id
    应改为:
    ) a
    update tb set f2=@d/5 where fid=@id
      

  3.   

    SELECT AVG(ChengJi) FROM (SELECT TOP 5 ChengJi FROM mydata.db0.001 ORDER BY MyId DESC)
    我这样写了在SQL查询分析器里执行,显示如下错误信息:
    服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: ')' 附近有语法错误。
    这是为什么呢?
      

  4.   

    SELECT AVG(ChengJi) FROM (SELECT TOP 5 ChengJi FROM mydata.db0.001 ORDER BY MyId DESC) a
      

  5.   

    谢谢!我怎么样才能将这个平均值更新到数据表里呢。不用存储过程,因为我的表名是变化的,存储过程的参数不能是表名。UPDATE mydata.dbo.001 SET PingJun =(这怎么写呀) WHERE MyId=RecordCount
      

  6.   

    什么意思呀??
    参数为什么不能用表名呢??
    将表名传给参数@TableName
    exec('update ' + @TableName + ' set PingJun = a.PJ from (SELECT AVG(ChengJi) as PJ FROM (SELECT TOP 5 ChengJi FROM ' + @TableName + ' ORDER BY MyId DESC) a')
      

  7.   

    我在程序里调用的,报错如下信息。
    Project Project1.exe raised exception class EOleException with message '第一行:'001'附近有语法错误。'. Process stopped. Use Step or Run to continue.(001为数据表名称)程序里我是这样调用的
    JiLuShu:= IntToStr(RecordCount);
    SQL.Add('exec mp_pjs ('''+TableName+''','''+JiLuShu+''')');存储过程
    CREATE PROCEDURE mp_pjs (@TableName varchar(20),@JiLuShu int)
    AS
      DECLARE @d NUMERIC(6,2)
      SELECT @d=AVG(ChengJi) FROM (
        SELECT TOP 5 ChengJi FROM [@TableName]
        ORDER BY MyId DESC
    ) a
    UPDATE [@TableName] SET PingJun =@d WHERE MyId=@JiLuShu
    烦请各位帮我一下,看看到底是哪儿错了
      

  8.   

    需要在存储过程里生成动态sql再执行:
    CREATE PROCEDURE mp_pjs (@TableName varchar(20),@JiLuShu int) 
    AS   DECLARE @sql varchar(8000)
      set @sql='
      DECLARE @d NUMERIC(6,2) 
      SELECT @d=AVG(ChengJi) FROM ( 
        SELECT TOP 5 ChengJi FROM '+@TableName+'
        ORDER BY MyId DESC 
    ) a 
    UPDATE '+@TableName+' SET PingJun =@d WHERE MyId='+@JiLuShu
    exec(@sql)end
      

  9.   


    感谢sz_haitao这几天来对我的无私帮助,通过sz_haitao的指导和自己的学习,我将存储过程修改为如下时运行通过。
    CREATE PROCEDURE mp_pjs
    AS
      DECLARE @I Int
      SET @I=(SELECT COUNT(MyId) FROM 001)
      If @I >= 5
      Begin
      DECLARE @d NUMERIC(6,2)
      SELECT @d=AVG(ChengJi) FROM (
        SELECT TOP 5 ChengJi FROM 001
        ORDER BY MyId DESC
      ) a
      UPDATE 001 SET PingJun =@d WHERE MyId=@I
      End
    但我将存储过程写为如下:
    CREATE PROCEDURE mp_pjs (@TableName varchar(20))
    AS
      DECLARE @I Int
      SET @I=(SELECT COUNT(MyId) FROM [@TableName])
      If @I >= 5
      Begin
      DECLARE @d NUMERIC(6,2)
      SELECT @d=AVG(ChengJi) FROM (
        SELECT TOP 5 ChengJi FROM [@TableName]
        ORDER BY MyId DESC
      ) a
      UPDATE [@TableName] SET PingJun =@d WHERE MyId=@I
      End
    执行过程
    在值的地方填入001
    服务器: 消息 208,级别 16,状态 1,过程 mp_pjs,行 4
    对象名 '@TableName' 无效。
    希望大家能再给予指点和帮助。
      

  10.   

    通过用exec sp_help '001'
    owner下显示为dbo
    执行过程值的地方填入dbo.001
    依然显示“对象名 '@TableName' 无效。”
      

  11.   

    sql不支持把 表名 作为变量的,只能组成动态sql字符串,再去执行这个字符串
      

  12.   

    按照你说的吧存储过程组成动态SQL字符串,执行通过,但在程序调用又出问题了。下面是我写调用语句。SQL.Add('exec mp_pjs '+TableName);
    Execsql;
    Project Project1.exe raised exception class EOleException with message '未能找到存储过程'mp_pjs'。'SQL.Add('exec mp_pjs '('+TableName+')');
    Execsql;
    Project Project1.exe raised exception class EOleException with message '第1行:'001'附近有语法错误。'SQL.Add('exec mp_pjs ('''+TableName+''')');
    Execsql;
    Project Project1.exe raised exception class EOleException with message '第1行:'001'附近有语法错误。'
      

  13.   

    解决了。很高兴。再次感谢sz_haitao的帮助。