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;
查看更多以下链接:
-
如果有任何疑问,请打电话给我:85110 51548
-
http://www.w3resource.com/sql/aggregate-functions/count-having.php
另一个解决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 。
希望有助于某人。