我想过滤一个表格,只显示总计与平均值相差 ± 3 个标准差的行。
我使用的查询是这样的:
SELECT *
FROM AccountsDatabase
WHERE total > (AVG(total) + STDEVP(total) * -3)
AND total < (AVG(total) + STDEVP(total) * +3)`
但我收到错误:
<块引用>聚合不能出现在 WHERE 子句中,除非它位于包含在 HAVING 子句或选择列表中的子查询中,并且被聚合的列是外部引用。
答案 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