在大学考试中有一个问题。是否可以在SQL WHERE
子句中。
我一直以为这是不可能的,我也找不到任何可能的例子。但是我的答案被标记为“错误”,现在我想知道在哪种情况下可以在中使用聚合函数WHERE
。同样,如果不可能的话,最好在描述的地方链接到规范。
Answers:
您还没有提到DBMS。假设您正在使用MS SQL Server,我发现了一条不言自明的T-SQL错误消息:
“除非聚集在HAVING子句或选择列表中包含的子查询中,否则聚集可能不会出现在WHERE子句中,并且正在聚集的列是外部引用”
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 ;
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子句中包含汇总的子查询。
更新查询:
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
参考文献:
希望可以帮助某人。