【发布时间】:2021-04-01 16:26:17
【问题描述】:
我有一个示例公司 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 结果错误,但我似乎找不到可以帮助我理解发生了什么的东西。
我做错了什么?我的语法在哪里生成不同的输出?提前谢谢!
【问题讨论】:
-
你不能真正使用这样的变量。 SQL 中的变量旨在用于维护批量查询之间 的状态,而不是在查询中保存临时数据。这就是派生表的用途。 (也有例外,比如连接字符串或作为
ROW_NUMBER的糟糕替代品,但我认为自从 MySQL 8 推出以来,那些日子已经过去很久了)。
标签: mysql sql sum inner-join aggregate-functions