在SQL中按名称和每日平均值进行聚合

时间:2014-12-02 17:34:50

标签: sql sql-server aggregate-functions sql-server-2014

我在表格中有以下格式的数据(我只显示了两个小时的值,但实际上我有24小时的值):

Name    Availability           Date             ItemID
--------------------------------------------------------
S1          75        2014-11-11 19:00:00.000   1124023
S1          80        2014-11-11 20:00:00.000   1124023
S2          60        2014-11-11 19:00:00.000   1124010
S2          50        2014-11-11 20:00:00.000   1124010

我希望在视图中以下列格式获得整天的平均可用性:

Name    Availability       Date     ItemID
--------------------------------------------------------
S1         77.5         2014-11-11  1124023
S2          55          2014-11-11  1124010

如果输出中的日期显示为2014-11-11 0:00:00.000,也没关系。

我尝试了以下操作,但它不起作用。任何帮助将不胜感激。

SELECT Name, AVG(Availability), CAST(FLOOR(CAST(Date AS FLOAT)) AS DATETIME) AS Expr1, ItemID
    FROM dbo.ServiceAvailability
    GROUP BY CAST(FLOOR(CAST(Date AS FLOAT)) AS DATETIME)

1 个答案:

答案 0 :(得分:3)

您当前的查询非常接近,您在GROUP BY子句中缺少几列。我还建议一种更短的方式来获取没有时间的日期。

SELECT 
  Name, 
  AVG(cast(Availability as decimal(10, 2))), 
  CAST([Date] as date) AS Expr1, 
  ItemID
FROM dbo.ServiceAvailability
GROUP BY Name, CAST([Date] as date), ItemID

Demo。由于您使用的是SQL Server 2014,因此您可以将日期时间列转换为date - 这会丢弃时间部分。我还建议您将Availability列转换为int以外的其他内容,以便获得小数。

由于您正在使用聚合函数,SELECT列表中未聚合的任何列都需要包含在GROUP BY子句中,因此您需要包含Name和{{1} }。