使用SQL聚合函数时是否必须搭配GROUP BY?附报错及查询示例
SQL聚合函数与GROUP BY的使用疑问及报错修复
核心问题解答:是否每次用聚合函数都必须搭配GROUP BY?
不是必须,分两种情况:
- 只查聚合函数本身:比如
select max(rate) from EmployeePayHistory,不需要GROUP BY——这是对整个表的所有行计算最高薪资,结果只有一个值,数据库能直接处理。 - 同时查聚合函数+非聚合列:比如要查每个员工的最高薪资(同时要
BusinessEntityID和max(rate)),就必须用GROUP BY把非聚合列(BusinessEntityID)分组。因为数据库需要明确:你要计算的是每个员工分组内的最高薪资,不然它不知道怎么把单个聚合结果和一堆员工ID对应起来。
你的报错原因分析
- Msg 8120:子查询里同时选了
BusinessEntityID和max(rate),但没加GROUP BY。数据库无法确定max(rate)对应哪个员工,所以报错说这个ID列要么放进聚合函数,要么放进GROUP BY。 - Msg 116:主查询的
where BusinessEntityID = (...)要求子查询返回单个值/单列,但你的子查询返回了两列(ID和薪资),类型不匹配,导致报错。
修正后的查询语句
方法1:先找全局最高薪资,再匹配对应员工
select * from HumanResources.Employee where BusinessEntityID in ( -- 找出所有拿到最高薪资的员工ID select eph.BusinessEntityID from HumanResources.EmployeePayHistory as eph where eph.Rate = (select max(Rate) from HumanResources.EmployeePayHistory) );
方法2:先按员工分组算最高薪资,再筛选出薪资等于全局最高的
select emp.* from HumanResources.Employee as emp join ( -- 先算出每个员工的最高薪资 select BusinessEntityID, max(Rate) as MaxRate from HumanResources.EmployeePayHistory group by BusinessEntityID ) as eph on emp.BusinessEntityID = eph.BusinessEntityID -- 筛选出薪资等于全局最高的员工 where eph.MaxRate = (select max(Rate) from HumanResources.EmployeePayHistory);
关键总结
- 当聚合函数和非聚合列同时出现在SELECT里,必须用GROUP BY把非聚合列分组。
- 用
=匹配子查询时,子查询只能返回单列;如果可能有多个结果,改用IN。
内容的提问来源于stack exchange,提问作者I'mveryconfused
相关产品推荐
相关产品推荐

