在大学的考试中有一个问题;是否可以在SQL WHERE
子句中使用聚合函数。
我一直认为这是不可能的,我也找不到任何可能的例子。但我的答案被标记为假,现在我想知道在哪些情况下可以在WHERE
中使用聚合函数。此外,如果不可能,那么获得指向描述的规范的链接会很好。
答案 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
参考文献:
希望帮助某人。
答案 6 :(得分:0)
如果您在 where 子句中使用聚合函数,则意味着您希望基于该聚合函数过滤数据。就我而言,它是 SUM()
。我会跳到解决方案。
(select * from(select sum(appqty)summ,oprcod from pckwrk_view group by oprcod)AS asd where summ>500)