为了简单起见,如果我有一个名为‘employee’的表:
id INT NOT NULL PRIMARY KEY,
salary FLOAT,
department VARCHAR(255)我想执行并查询我在哪里检索每个部门的最低工资。所以我的查询是这样的:
SELECT employee.ID, MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department但是不管找到了哪些记录。结果集中的ID值被重命名为1,2,3...结果集中最多存在多少条记录(部门)。
在执行聚合函数和GROUP BY后,如何维护员工的实际ID
发布于 2010-01-20 08:21:27
想一想,如果一个部门有20名员工,而该部门有3名员工的最低工资相同,那么您希望查询输出显示哪个EmployeeId?如果保证每个部门中只有一名员工具有最低工资,则可以通过选择特定员工记录来实现,其中工资是每个部门的最小值:
Select EmployeeID
From Employee e
Where Salary =
(Select Min(Salary) From EMployee
Where DepartmentId = e.DepartmentId)但是,当多个员工具有该最低工资水平时,这将为每个部门返回多条记录。
发布于 2010-01-20 09:38:11
我猜您使用的是MySQL或SQLite,因为您的查询是不明确的,标准SQL或大多数品牌的RDBMS都不允许这样做。MySQL和SQLite更为宽松,因此您有责任解决歧义问题。
这是我通常的解决方法:
SELECT e1.ID, e1.salary, e1.department
FROM employee e1
LEFT OUTER JOIN employee e2 ON (e1.department = e2.department
AND e1.salary > e2.salary)
WHERE e2.department IS NULL;下面是另一个解决方案,它给出了相同的结果:
SELECT e1.ID, e1.salary, e1.department
FROM employee e1
JOIN (SELECT e2.department, MIN(e2.salary) AS min_salary
FROM employee e2 GROUP BY e2.department) d
ON (e1.salary = d.min_salary);如果部门中有多名员工具有相同的最低工资,则这两种方法都会为每个部门提供多行。你需要决定如何解决这个问题,因为你的问题描述并不清楚。
发布于 2010-01-20 08:17:25
这将会起到作用:
SELECT employee.department, MIN(employee.salary), employee.ID
FROM employee
GROUP BY 1https://stackoverflow.com/questions/2098186
复制相似问题