SQL WHERE-Clause中的聚合函数

时间:2011-06-11 23:38:27

标签: sql

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

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

7 个答案:

答案 0 :(得分:93)

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)

答案 1 :(得分:26)

您尚未提及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 ;

答案 2 :(得分:9)

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

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

答案 3 :(得分:7)

更新的查询:

select id from t where id < (select max(id) from t);

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

答案 4 :(得分:3)

SELECT COUNT( * )   
FROM agents   
HAVING COUNT(*)>3;  

请参阅以下链接:

答案 5 :(得分:2)

另一个解决方案是将聚合函数移动到标量用户定义函数

创建您的功能

CREATE FUNCTION getTotalSalesByProduct(@ProductName VARCHAR(500))
RETURNS INT
AS
BEGIN

DECLARE @TotalAmount INT

SET @TotalAmount = (select SUM(SaleAmount) FROM Sales where Product=@ProductName)

RETURN @TotalAmount

END

在Where子句中使用函数

SELECT ProductName, SUM(SaleAmount) AS TotalSales
FROM Sales
WHERE dbo.getTotalSalesByProduct(ProductName)  > 1000
GROUP BY Product

参考文献:

1. 2.

希望帮助某人。

答案 6 :(得分:0)

如果您在 where 子句中使用聚合函数,则意味着您希望基于该聚合函数过滤数据。就我而言,它是 SUM()。我会跳到解决方案。

(select * from(select sum(appqty)summ,oprcod from pckwrk_view group by oprcod)AS asd where summ>500)

  1. 内部查询用于获取需要过滤的结果。
  2. 必须为必须过滤掉的聚合函数指定一个 ALIAS 名称,因为外部查询无法访问或识别聚合函数内列的实际名称。
  3. 最后,过滤器可以应用于内部查询中列的别名