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

SQL问题求助:计算营销与工程部门最高薪资绝对差额

问题排查与修正方案

你的SQL语句核心问题在于CASE分支里的ELSE 0设置:当目标部门(比如工程部门)没有员工时,该分支会返回0,导致MAX()将0错误认定为该部门的最高薪资,而非代表无数据的NULL,最终造成差值计算偏差。

修正写法一:调整CASE分支逻辑

将ELSE 0改为ELSE NULL,MAX()函数会自动忽略NULL值,确保只有目标部门的薪资参与最大值计算:

SELECT
  ABS(MAX(CASE 
           WHEN dept.department = 'marketing' THEN emp.salary 
           ELSE NULL 
         END) - 
      MAX(CASE 
           WHEN dept.department = 'engineering' THEN emp.salary 
           ELSE NULL 
         END)) AS salary_difference 
FROM db_employee emp 
JOIN db_dept dept ON emp.department_id = dept.id

更严谨写法二:先聚合部门最高薪资

先分组计算目标部门的最高薪资,再基于聚合结果计算差值,逻辑更清晰,也更容易处理部门无员工的场景:

WITH dept_max_salary AS (
    SELECT
        dept.department,
        MAX(emp.salary) AS max_sal
    FROM db_employee emp
    JOIN db_dept dept ON emp.department_id = dept.id
    WHERE dept.department IN ('marketing', 'engineering')
    GROUP BY dept.department
)
SELECT
    ABS(MAX(CASE WHEN department = 'marketing' THEN max_sal END) - 
        MAX(CASE WHEN department = 'engineering' THEN max_sal END)) AS salary_difference
FROM dept_max_salary

如果需要将无员工部门的薪资默认设为0,可以用COALESCE()处理NULL值:

WITH dept_max_salary AS (
    SELECT
        dept.department,
        MAX(emp.salary) AS max_sal
    FROM db_employee emp
    JOIN db_dept dept ON emp.department_id = dept.id
    WHERE dept.department IN ('marketing', 'engineering')
    GROUP BY dept.department
)
SELECT
    ABS(COALESCE(MAX(CASE WHEN department = 'marketing' THEN max_sal END), 0) - 
        COALESCE(MAX(CASE WHEN department = 'engineering' THEN max_sal END), 0)) AS salary_difference
FROM dept_max_salary

内容的提问来源于stack exchange,提问作者Lakshmikant Bhusanagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:03:17