SQL WHERE 子句中的聚合函数

新手上路,请多包涵

在大学的一次考试中,有一道题;是否可以在 SQL WHERE 子句中使用聚合函数。

我一直认为这是不可能的,我也找不到任何可能的例子。但是我的回答被标记为错误,现在我想知道在哪些情况下可以在 WHERE 中使用聚合函数。此外,如果不可能的话,最好能获得描述它的规范的链接。

原文由 n3on 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 738
2 个回答

您还没有提到 DBMS。假设您使用的是 MS SQL-Server,我发现了一条不言自明的 T-SQL 错误消息:

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

http://www.sql-server-performance.com/


还有一个可以在子查询中使用的示例。

为有 5 个或更多订单的人显示所有客户和最小订单(其他人为 NULL):

 SELECT a.lastname
     , a.firstname
     , ( SELECT MIN( o.amount )
         FROM orders o
         WHERE a.customerid = o.customerid
           AND COUNT( a.customerid ) >= 5
        )
        AS smallestOrderAmount
FROM account a
GROUP BY a.customerid
       , a.lastname
       , a.firstname ;


更新。

以上在 SQL-Server 和 MySQL 中运行,但它没有返回我预期的结果。下一个更接近。我想这与 customerid 字段有关,GROUPed BY 并在查询-子查询连接中使用在第一种情况下是外部表的 PRIMARY KEY,而在第二种情况下则不是。

显示有 5 个或更多订单的所有客户 ID 和订单数量(其他订单为 NULL):

 SELECT o.customerid
     , ( SELECT COUNT( o.customerid )
         FROM account a
         WHERE a.customerid = o.customerid
           AND COUNT( o.customerid ) >= 5
        )
        AS cnt
FROM orders o
GROUP BY o.customerid ;

原文由 Tim Schmelter 发布,翻译遵循 CC BY-SA 3.0 许可协议

HAVING 就像带有聚合函数的 WHERE,或者您可以使用子查询。

 select EmployeeId, sum(amount)
from Sales
group by Employee
having sum(amount) > 20000

或者

select EmployeeId, sum(amount)
from Sales
group by Employee
where EmployeeId in (
    select max(EmployeeId) from Employees)

原文由 Jason Goemaat 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进