【问题标题】:How to use the results of a query to filter a table comparing one field to the result?如何使用查询结果来过滤将一个字段与结果进行比较的表?
【发布时间】:2021-06-12 00:52:42
【问题描述】:

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

我正在使用的查询是这样的:

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

但我得到了错误:

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

【问题讨论】:

  • 检查GROUP BYHAVING
  • 如果您可以提供与您的问题相关的示例数据和架构,帮助的人可以带来更好的方法。 @fvdev

标签: sql sql-server tsql


【解决方案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

【讨论】:

  • 非常感谢!我使用了第二种方式,非常适合我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2015-08-06
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多