jor*_*oro 2 mysql sql select group-by aggregate-functions
我有名字,工资和员工部门的数据库.我需要一个查询来获得每个部门薪水最高的员工.
数据库:
create table test(
employee_name VARCHAR(255),
department VARCHAR(255),
salary INT
);
Run Code Online (Sandbox Code Playgroud)
数据:
INSERT INTO test(employee_name, department, salary) VALUES
("John", "DepartmentA", 1500),
("Sarah","DepartmentA", 1600),
("Romel","DepartmentA", 1400),
("Victoria","DepartmentB", 1400),
("Maria", "DepartmentB", 1600);
Run Code Online (Sandbox Code Playgroud)
我的尝试:
1.1 WHERE MAX(薪水)=工资GROUP BY部门
SELECT employee_name, salary FROM test WHERE MAX(salary) = salary GROUP BY department;
ERROR 1111 (HY000): Invalid use of group function
Run Code Online (Sandbox Code Playgroud)
1.2.当我用硬编码值替换MAX(薪水)时,它按预期工作:
SELECT employee_name, salary FROM test WHERE 1600 = salary GROUP BY department;
+---------------+--------+
| employee_name | salary |
+---------------+--------+
| Sarah | 1600 |
| Maria | 1600 |
+---------------+--------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
有条款的错误答案(单个结果,不是每个部门):
SELECT employee_name,salary FROM test GROUP BY department HAVING MAX(薪水)=工资;
+ --------------- + -------- + | employee_name | 工资| + --------------- + -------- + | 玛丽亚| 1600 | + --------------- + -------- + 1行(0.00秒)
我期望的结果是:
Sarah, DepartmentA
Maria, DepartmentB
Run Code Online (Sandbox Code Playgroud)
首先,您必须获得每个部门的最高薪水:
SELECT department, max(salary) as max_salary
FROM test
GROUP BY department
Run Code Online (Sandbox Code Playgroud)
然后你可以将这个子查询加入到测试表中:
SELECT t.*
FROM
test t INNER JOIN (
SELECT department, max(salary) as max_salary
FROM test
GROUP BY department
) d ON t.department=d.department AND t.salary=d.max_salary
Run Code Online (Sandbox Code Playgroud)