SQL WHERE-Clause中的聚合函数

n3o*_*3on 67 sql

在大学的考试中有一个问题; 是否可以在SQL WHERE子句中使用聚合函数.

我一直认为这是不可能的,我也找不到任何可能的例子.但我的答案被标记为假,现在我想知道在哪些情况下可以使用聚合函数WHERE.此外,如果不可能,那么获得指向描述的规范的链接会很好.

Jas*_*aat 100

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

select EmployeeId, sum(amount)
from Sales
group by Employee
having sum(amount) > 20000
Run Code Online (Sandbox Code Playgroud)

要么

select EmployeeId, sum(amount)
from Sales
group by Employee
where EmployeeId in (
    select max(EmployeeId) from Employees)
Run Code Online (Sandbox Code Playgroud)

  • 感谢你给'HAVING`这个正确答案;) (20认同)
  • 是的,有可能我知道。但是这里给出了。我认为这是一个定义。 (2认同)
  • 谢谢你!这正是我需要知道和理解的。投票赞成。 (2认同)

Tim*_*ter 29

您还没有提到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 ;
Run Code Online (Sandbox Code Playgroud)

UPDATE.

以上都在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 ;
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 10

您不能直接在WHERE子句中使用聚合; 这就是HAVING条款的用途.

您可以使用包含WHERE子句中的聚合的子查询.

  • 参见蒂姆的答案。有可能的。 (2认同)

Cha*_*shu 9

更新的查询:

select id from t where id < (select max(id) from t);
Run Code Online (Sandbox Code Playgroud)

它将从表t中选择除最后一行之外的所有行.

  • 我相信这将取决于Tim提到的DBMS。在标准SQL中,您必须将其写为`SELECT id FROM t WHERE id &lt;(SELECT MAX(id)FROM t)` (2认同)
  • 是的,但是聚合函数位于子查询的select子句中,而不位于WHERE中。而且我认为子查询不能被视为聚合函数。 (2认同)

Sam*_*ani 5

SELECT COUNT( * )   
FROM agents   
HAVING COUNT(*)>3;  
Run Code Online (Sandbox Code Playgroud)

请参阅下面的更多链接: