查找部门中获得最低工资的所有雇员及其薪水,并按升薪顺序显示结果

问题描述 投票:0回答:2

employee database

SELECT name, MIN(salary)
FROM employee
GROUP BY deptid;

为什么我不能在这里选择“名称”?对这个问题的建议查询是什么?

sql select greatest-n-per-group
2个回答
0
投票

与数据库无关的解决方案是使用子查询进行过滤:

select e.*
from emp e
where e.salary = (select min(e1.salary) from emp e1 where e1.deptid = e.deptid)
order by e.salary

0
投票

为什么我不能在这里选择“名称”?

您只能使用SELECT的列或表达式,如果它们存在于GROUP BY区域中,或者是计算聚合的函数的一部分。

想像水桶一样分组。当您说group by dept_id时,是否有3个部门(即使被提及20次; A,A,A,A,A,A,A,A,A,A,A,A,B, B,B,B,B,C,C,C),您将获得3个存储桶,每个存储单元对应一个不同的dept_id值(A的存储桶,B的存储桶和C的存储桶)。在这些存储桶中,将根据其所在部门将所有员工行抛出:A中的12行,B中的5行,C中的3行。然后说MIN(salary),数据库搜索每个存储桶以寻找最小的行薪水。

你为什么不说name?根本就没有水桶。各个部门的存储桶分别标记为A,B和C。没有存储桶上写有名称。虽然存储桶中有名称,但是您只能以MIN,MAX,AVG,SUM,COUNT等为准进行查询-这是规则。要从桶中取出东西,您必须使用某种计算出统计量的函数。

如果您要求输入姓名,DB应该给您什么信息?

您可以要求输入MIN(name),但您只会得到一个名字。您可以按名称分组。.但是您会有更多的存储桶,您的员工将在存储桶中重新分配。您将不再需要每个部门存储区的最低薪水,而是想要每个姓名的最低薪水。。不是您想要的

该问题的建议查询是什么?

分解:

“部门最低工资”

我们需要所有部门的清单以及该部门的最低工资

SELECT dept_id, MIN(salary) as min_sal_for_dept
FROM employee
GROUP BY dept_id

“查找在其部门中获得最低工资的所有雇员。

现在我们知道部门编号和最低工资适用于该部门,我们可以将其重新加入到有关部门编号和工资的员工数据中

SELECT * 
FROM
(
  SELECT dept_id, MIN(salary) as sal
  FROM employee
  GROUP BY dept_id
) dep_min_sals
INNER JOIN
employee e
ON
  e.dept_id = dep_min_sals.dept_id AND e.salary = dep_min_sals.sal

“按薪资升序显示结果”

ORDER BY sal

要实现的关键是,您必须对(丢失的)详细信息进行分组以便获得每个部门的最低薪水,因此,如果您想返回详细信息,则必须将分组的数据重新加入到详细信息中。您既不能丢失详细信息以计算最小值,又不能保留详细信息以保留员工姓名

© www.soinside.com 2019 - 2024. All rights reserved.