如何对where子句中的数据字段和聚合函数进行算术运算?

时间:2013-05-18 12:17:56

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

我正在使用此查询返回浮点字段在其平均值周围的分布:

SELECT  COUNT(*) AS [Count], Result FROM    (
  SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM Results)
GROUP  BY Result

此查询返回所有记录与平均值之间的距离。现在,我需要过滤超出±3SD范围的记录。我想也许我可以通过将查询更改为:

来轻松实现此目的
SELECT  COUNT(*) AS [Count], Result FROM    (
  SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM Results 
    HAVING Abs(Result - AVG(Result)) OVER() < 3 * STDEV(Result) OVER())
GROUP  BY Result

但是SQL Server给了我两个错误:

  

列'Results.Result'在HAVING子句中无效,因为它是   不包含在聚合函数或GROUP BY子句中。

     

窗口函数只能出现在SELECT或ORDER BY子句中。

我如何实现我正在寻找的目标?谷歌今天对我不好: - (

1 个答案:

答案 0 :(得分:3)

如第二条错误消息所示,窗口函数只能出现在SELECT或ORDER BY子句中 - 所以不要将它们包含在HAVING子句中,而是将它们包含在内部SELECT中,然后在外部WHERE子句中选择它们 - 像这样:

SELECT  COUNT(*) AS [Count], Result FROM    
(SELECT ROUND(Result - AVG(Result) OVER(), 1) Result,
        Abs(Result - AVG(Result) OVER()) avgdiff,
        STDEV(Result) OVER() stddev
 FROM Results) r
WHERE avgdiff < 3 * stddev
GROUP  BY Result