You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQL聚合函数时是否必须搭配GROUP BY?附报错及查询示例

SQL聚合函数与GROUP BY的使用疑问及报错修复

核心问题解答:是否每次用聚合函数都必须搭配GROUP BY?

不是必须,分两种情况:

  • 只查聚合函数本身:比如select max(rate) from EmployeePayHistory,不需要GROUP BY——这是对整个表的所有行计算最高薪资,结果只有一个值,数据库能直接处理。
  • 同时查聚合函数+非聚合列:比如要查每个员工的最高薪资(同时要BusinessEntityID和max(rate)),就必须用GROUP BY把非聚合列(BusinessEntityID)分组。因为数据库需要明确:你要计算的是每个员工分组内的最高薪资,不然它不知道怎么把单个聚合结果和一堆员工ID对应起来。

你的报错原因分析

  1. Msg 8120:子查询里同时选了BusinessEntityID和max(rate),但没加GROUP BY。数据库无法确定max(rate)对应哪个员工,所以报错说这个ID列要么放进聚合函数,要么放进GROUP BY。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 09:42:46