SQL WHERE-Clauses中的聚合函数

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

我一直认为这是不可能的,我也找不到任何可能的例子。 但我的答案被标记为false,现在我想知道在哪些情况下可以在WHERE使用聚合函数。 另外,如果这是不可能的,它将很好的链接到它所描述的规范。

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

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

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


还有一个例子,在子查询中是可能的。

显示所有客户和最小的订单(5位或更多订单):

 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 ; 

UPDATE。

上面的SQL Server和MySQL都运行,但是不会返回我期望的结果。 下一个更接近。 我想它是与字段customerid ,GROUPed BY和在查询子查询连接中使用第一种情况下的外部表的PRIMARY KEY和第二种情况下它不是。

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

 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 ; 

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) 

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

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

UPDATED查询:

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

它将从表t中select除最后一行以外的所有内容。

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

查看更多以下链接:

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

创build您的function:

 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 

在哪里使用函数

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

参考文献:

1 。

希望有助于某人。