【问题标题】:TSQL Average timeTSQL 平均时间
【发布时间】:2015-09-04 01:31:20
【问题描述】:

我有一个简单的存储过程,用于显示一些基本的用户统计信息。我正在显示提交的总数、所有这些提交所花费的总时间以及平均花费的时间。

我遇到了两个问题。首先,当内部选择中有多个记录时,这会中断。

我的第二个问题是如何正确计算该用户所有记录的平均时间。

有人可以指出一些我可以更改以下代码的方法,以便获得所有记录的总时间和平均时间,而不仅仅是一个?

SELECT count(itemID) AS totalSubmissions,
       CONVERT(VARCHAR(20), GETUTCDATE(), 100) as lastUpdate,
       (
        SELECT COALESCE(DATEDIFF(MINUTE, s.startTime, s.endTime + 1) , 0)
        FROM itemTracker_records as s
        WHERE QID = @QID
       ) as totalTime,
       (
        SELECT COALESCE(DATEDIFF(MINUTE, s.startTime, s.endTime + 1) , 0)
        FROM itemTracker_records as s
        WHERE QID = @QID
       ) as averageTime 
FROM   itemTracker_records
WHERE  QID = @QID
FOR    XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root')

【问题讨论】:

标签: sql-server tsql stored-procedures sql-server-2012


【解决方案1】:
  1. 当然会中断 - 子查询中没有聚合。不过,在这种特殊情况下,您似乎不需要它们。
  2. 令人惊讶的是,平均值是由AVG() 函数计算得出的。
  3. (有根据的猜测)您可能的意思是,如果指定了 start 和 end 但相等,您可能需要至少一分钟的时间?唉,在您的代码中添加了 1 天 - 已修复。

所以结果看起来类似于:

SELECT count(r.itemID) AS totalSubmissions,
    CONVERT(VARCHAR(20), GETUTCDATE(), 100) as lastUpdate,
    sum(isnull(DATEDIFF(MINUTE, r.startTime, r.endTime) + 1 , 0)) as [totalTime],
    avg(isnull(DATEDIFF(MINUTE, r.startTime, r.endTime) + 1 , 0)) as [averageTime]
FROM   dbo.itemTracker_records r
WHERE  r.QID = @QID
FOR    XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root');

最后但并非最不重要的一点:永远不要忘记模式和对象别名,除非您故意试图混淆某人,包括您自己。

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2011-01-14
    相关资源
    最近更新 更多