如何创建用于计算平均运行时间的T-SQL存储过程

时间:2017-07-21 13:28:23

标签: sql tsql

我有一张318记录表。以下是表中包含的信息示例。

select * from TableName

输出:

TestSequence     RunTime     TestName    
     1             12.00       Shark
     1             12.01       Shark
     1             13.02       Shark
     2             15.02       Lion
     2             10.13       Lion
     2             16.03       Lion
     3             18.02       pig
     3             12.58       pig
     3             17.00       pig
     4             14.69       Bird
     4             15.96       Bird
     4             16.32       Bird

正如您所看到的,每个TestName在表中有3个条目,运行时间不同。所以我想要的是计算每个TestName的平均RunTime。

这是我期待的结果:

TestSequence  TestName AverageRunTime
   1           Shark       12.50
   2           Lion        13.26
   3           pig         12.56
   4           Bird        15.36

我希望存储过程能够计算表中所有318行的平均运行时间。我从来没有在我的生活中创建过一个存储过程,因为我还是从大学毕业。

我正在尝试构建一个存储过程,如下所示:

USE [DBName];  
GO  
CREATE PROCEDURE Test_CalculateAverageRunTime   
    @TestName varchar(50),   
    @TestSenquence varchar(50),
    @RunTime varchar(50)   
AS   

    SET NOCOUNT ON;  
    SELECT TestName, TestSequence, AVG(RunTime) 
    FROM TableName
    WHERE TestSequence = @TestSenquence
    Group By TestName, TestSequence;


GO  

还有其他方法可以做什么吗?

2 个答案:

答案 0 :(得分:1)

您需要的是:

SELECT TestName, TestSequence, AVG(RunTime) 
FROM TableName
WHERE TestSequence = @TestSenquence
GROUP BY TestName, TestSequence

如果您使用AVG等聚合函数,则需要GROUP BY。您只需要@TestSenquence作为参数。你的其余部分都很好。

将始终针对FROM子句中指定的表运行存储过程。如果你想动态地更改表名,那么这是一个完全不同的区域。

这是最好的解决方案。您需要的是运行带有变量/参数的脚本来确定输出=>存储过程是未来的方向。另一种方法是创建一个表值函数,但这样就太过分了。

答案 1 :(得分:1)

如果您想要表中的所有行,请删除where子句。存储过程看起来更像是这样:

CREATE PROCEDURE Test_CalculateAverageRunTime  ()
AS 
BEGIN  
    SET NOCOUNT ON;  
    SELECT TestName, TestSequence, AVG(RunTime) as avg_RunTime
    FROM TableName
    Group By TestName, TestSequence;
END;

但是,我认为内联表值函数可能更合适:

CREATE FUNCTION Test_CalculateAverageRunTime  ()
RETURNS TABLE AS
RETURN( SELECT TestName, TestSequence, AVG(RunTime) as avg_RunTime
        FROM TableName
        Group By TestName, TestSequence
      );

然后您可以在查询中使用结果。