【发布时间】:2011-06-11 23:38:27
【问题描述】:
在大学的一次考试中有一道题;是否可以在SQL WHERE 子句中使用聚合函数。
我一直认为这是不可能的,我也找不到任何例子。但是我的回答被标记为假,现在我想知道在哪些情况下可以在WHERE 中使用聚合函数。此外,如果不可能的话,最好能得到一个链接到描述它的规范。
【问题讨论】:
标签: sql
在大学的一次考试中有一道题;是否可以在SQL WHERE 子句中使用聚合函数。
我一直认为这是不可能的,我也找不到任何例子。但是我的回答被标记为假,现在我想知道在哪些情况下可以在WHERE 中使用聚合函数。此外,如果不可能的话,最好能得到一个链接到描述它的规范。
【问题讨论】:
标签: sql
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)
【讨论】:
您还没有提到 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 ;
【讨论】:
您不能在 WHERE 子句中直接使用聚合;这就是 HAVING 子句的用途。
您可以在 WHERE 子句中使用包含聚合的子查询。
【讨论】:
更新的查询:
select id from t where id < (select max(id) from t);
它将从表 t 中选择除最后一行之外的所有内容。
【讨论】:
SELECT id FROM t WHERE id < (SELECT MAX(id) FROM t)
SELECT COUNT( * )
FROM agents
HAVING COUNT(*)>3;
查看更多链接:
【讨论】:
另一个解决方案是将聚合函数移动到标量用户定义函数
创建你的函数:
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
参考资料:
希望能帮助别人。
【讨论】:
如果您在 where 子句中使用聚合函数,则意味着您希望根据该聚合函数过滤数据。就我而言,它是SUM()。我会跳到解决方案。
(select * from(select sum(appqty)summ,oprcod from pckwrk_view group by oprcod)AS asd where summ>500)
【讨论】: