使用带有临时变量的 MySQL CASE 语句,CASE 结果不正确?
Using MySQL CASE statement with temporary variable, and CASE result is incorrect?
我有一个样本公司人力资源数据库,其中 table 的员工和职位。
employees
job_id name salary
jobs
job_id job_title
我的目标是输出一个 table,其中包含每个职位和该职位的员工人数,以及每个职位的平均工资,因此 table 看起来像这样:
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 语句,Public 会计师的范围应该是 'Medium'。而且我不确定为什么这是错误的。显然,我没有收到任何错误,所以我一直在搜索错误的 CASE 结果,但我似乎找不到可以帮助我理解发生了什么的东西。
我做错了什么?我的语法在哪里生成不同的输出?提前致谢!
使用这样的变量很棘手,因为 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
我有一个样本公司人力资源数据库,其中 table 的员工和职位。
employees
job_id name salary
jobs
job_id job_title
我的目标是输出一个 table,其中包含每个职位和该职位的员工人数,以及每个职位的平均工资,因此 table 看起来像这样:
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 语句,Public 会计师的范围应该是 'Medium'。而且我不确定为什么这是错误的。显然,我没有收到任何错误,所以我一直在搜索错误的 CASE 结果,但我似乎找不到可以帮助我理解发生了什么的东西。
我做错了什么?我的语法在哪里生成不同的输出?提前致谢!
使用这样的变量很棘手,因为 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