使用带有临时变量的 MySQL CASE 语句,并且 CASE 结果不正确?

时间:2020-12-23 00:36:57

标签: mysql sql sum inner-join aggregate-functions

我有一个示例公司 HR 数据库,其中包含表员工和工作。

employees
job_id name salary

jobs
job_id job_title

我的目标是输出一个表格,其中包含每个职位和该职位的员工人数,以及每个职位的平均工资,所以表格看起来像这样:

Job Title  Number of Employees  Average Salary  Range

这是我当前的 SQL 代码:

SELECT j.job_title AS 'Job Title', 
       COUNT(*) AS 'Number of Employees', 
       @averageSalary := ROUND(AVG(e.salary), 0) AS 'Average Salary',
       CASE 
           WHEN @averageSalary BETWEEN 0 AND 5000 THEN 'Low'
           WHEN @averageSalary BETWEEN 5001 AND 10000 THEN 'Medium'
           WHEN @averageSalary > 10001 THEN 'High'
       ELSE 'N/A' END AS 'Range'
FROM employees AS e
JOIN jobs AS j ON e.job_id = j.job_id
GROUP BY e.job_id;

我得到的输出是:

Job Title Number of Employees Salary Range
'Public Accountant', '1', '8300', 'High'
'Accounting Manager', '1', '12000', 'Medium'
'Administration Assistant', '1', '4400', 'High'
'President', '1', '24000', 'Low'

这显然是错误的,因为根据我的 CASE 声明,公共会计师的范围应该是“中”。我不确定为什么这是错误的。显然,我没有收到任何错误,所以我一直在寻找错误的 CASE 结果,但我似乎找不到可以帮助我了解正在发生的事情的东西。

我做错了什么?我的语法在哪里生成不同的输出?提前致谢!

1 个答案:

答案 0 :(得分:3)

使用这样的变量很棘手,因为 select 子句中表达式的计算顺序是未定义的。您无法事先判断变量是在 case 表达式计算之前还是之后赋值。

您可以重复表达式,也可以使用子查询:

select j.job_title, e.*,
        case 
            when e.average_salary between 0 and 5000 then 'low'
            when e.average_salary between 5001 and 10000 then 'medium'
            when e.average_salary > 10001 then 'high'
            else 'n/a' 
        end as salary_range
from (
    select job_id, 
        count(*) as number_of_employees, 
        round(avg(salary), 0) as average_salary
    from employees
    group by job_id
) e
inner join jobs j on j.job_id = e.job_id
相关问题