如何使用查询的结果来过滤将一个字段与结果进行比较的表?

时间:2021-06-12 00:52:42

标签: sql sql-server tsql

我想过滤一个表格,只显示总计与平均值相差 ± 3 个标准差的行。

我使用的查询是这样的:

   SELECT * 
      FROM AccountsDatabase
      WHERE total > (AVG(total) + STDEVP(total) * -3) 
      AND total < (AVG(total) + STDEVP(total) * +3)`

但我收到错误:

<块引用>

聚合不能出现在 WHERE 子句中,除非它位于包含在 HAVING 子句或选择列表中的子查询中,并且被聚合的列是外部引用。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情。我添加了一些示例数据,因为您的问题没有给出任何数据和模式。当您在我们的查询中使用聚合函数时,您需要使用 group by 子句。建议你参考SQL server中的Group by和聚合函数。

示例数据脚本:

  SELECT * 
     INTO #SRC_Data
     FROM
      (
        SELECT 0 AS A, 8.0 AS B,1 AS C UNION ALL
        SELECT 1, 8.0,7 UNION ALL
        SELECT 2, 6.0,3 UNION ALL
        SELECT 3,9.0,4 UNION ALL
        SELECT 4, 10.0,6 UNION ALL
        SELECT 5, 11.0,2 

      ) AS A

第一种方法:在过滤器中使用聚合函数时需要使用 GROUP BY 和 HAVING。可以按组过滤。

    SELECT *        
    FROM #SRC_Data
    GROUP BY  A, B, C
    HAVING A >= (AVG(A) + STDEVP(A) * -3) 
        AND A < (AVG(A) + STDEVP(A) * 3)

第二种方式:使用聚合作为子查询。在这种情况下,您不需要像在 where 子句中使用子查询那样使用 group by 或 have。

   SELECT * 
    FROM #SRC_Data
       WHERE A > ( SELECT AVG(B) FROM #SRC_Data ) +  ( SELECT STDEVP(B)  * -3 FROM #SRC_Data) 
            AND A <  (SELECT AVG(B) FROM #SRC_Data ) +  ( SELECT STDEVP(B) * 3 FROM #SRC_Data)

     DROP TABLE #SRC_Data
相关问题