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

使用SQL HAVING子句结合聚合函数报错,求原因及正确查询

问题分析与解决

原SQL的错误原因

你的SQL逻辑存在核心问题:

  • 执行GROUP BY salary*months后,每个分组的salary*months是该组固定的收入值,此时MAX(salary*months)在每个分组内计算的结果就是该组自身的salary*months,因此HAVING MAX(salary*months) = salary*months会匹配所有分组,最终返回所有收入档次的员工数,完全达不到只筛选最高收入分组的需求。
  • 部分数据库的严格模式下,HAVING子句引用未聚合且未在GROUP BY中声明的列可能触发语法报错,但这里主要问题是逻辑错误导致结果不符合预期。

正确的解法

方法1:子查询获取最高收入后统计

SELECT 
    salary * months AS earnings,
    COUNT(*) AS num_employees
FROM employee
WHERE salary * months = (SELECT MAX(salary * months) FROM employee)
GROUP BY salary * months;

思路:先用子查询算出全表员工的最高总收入,再筛选出收入等于该最大值的员工,最后统计对应分组的员工数量。

方法2:使用窗口函数(适用于PostgreSQL、MySQL 8+、SQL Server等支持窗口函数的数据库)

SELECT 
    earnings,
    num_employees
FROM (
    SELECT 
        salary * months AS earnings,
        COUNT(*) OVER (PARTITION BY salary * months) AS num_employees,
        RANK() OVER (ORDER BY salary * months DESC) AS rnk
    FROM employee
) t
WHERE rnk = 1
LIMIT 1;

思路:通过RANK()窗口函数给收入从高到低排名,筛选出排名第一的分组;同时用COUNT(*) OVER统计对应收入分组的员工总数。

方法3:分组后排序取第一条

SELECT 
    salary * months AS earnings,
    COUNT(*) AS num_employees
FROM employee
GROUP BY salary * months
ORDER BY earnings DESC
LIMIT 1;

思路:先按收入分组统计各档次的员工数,再按收入降序排序,取第一条结果就是最高收入的分组信息,简单直接。

内容的提问来源于stack exchange,提问作者Achint Kaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:08:12