查找所有在其部门获得最低工资的员工及其工资,按工资升序显示结果

mu0hgdu0  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(375)

员工数据库

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

为什么我不能在这里选择“name”?对这个问题有什么建议?

o0lyfsai

o0lyfsai1#

为什么我不能在这里选择“name”?
如果列或表达式存在于group by area或计算聚合的函数的一部分中,则只能使用select。
把分组想象成桶。当你说 group by dept_id 如果有3个部门(即使提到20次;a、a、a、a、a、a、a、a、a、a、a、a、a、a、b、b、b、b、c、c、c部门的20名员工)您可以得到3个存储桶,每个存储桶的外部都有一个标签,每个存储桶对应不同的部门id值(a存储桶、b存储桶和c存储桶)。在这些桶中,所有的员工行都会根据他们所在的部门而被抛出:a中有12行,b中有5行,c中有3行。然后你说 MIN(salary) ,db搜索每个bucket以查找最低工资。
为什么你不能说 name ? 根本没有一个桶可以装它。你的桶上贴着a、b、c三个部门的标签。没有一个桶上写着名字。虽然桶里有名字,但你只能用一个词来问 MIN , MAX , AVG , SUM , COUNT 等等——这是规矩。”要想从桶里得到一些东西,你必须使用某种函数来计算一些统计数据。实际上,在某些数据库中,您可以请求包含所有名称的csv字符串,但我们将忽略这一点,因为这是要点的附件:除非您使用聚合函数,否则您只能请求写在bucket外部的内容
如果你问姓名,db应该给你什么信息?
你可以问敏(名字),但你只能得到一个名字。你可以按名字分组。。但是你会有更多的桶,你的员工会被重新分配到不同的桶里。你不会再要求每个部门的最低工资了,你会要求每个名字的最低工资。。不是你想要的
对这个问题有什么建议?
分解:
“部门最低工资”
我们需要一份所有部门的名单和最低工资

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

“找到所有的电磁脉冲。。在他们部门挣最低工资的人”
现在我们知道depatment id和min salary是该部门的,我们可以将它连接回department id和salary上的员工数据

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

要意识到的关键是,为了获得每个部门的最低工资,您必须对详细信息进行分组(丢失),因此,如果您要恢复详细信息,您必须将分组的数据连接到详细信息。不能同时丢失用于计算最小值的详细信息,也不能将详细信息保留为员工姓名

qjp7pelc

qjp7pelc2#

独立于数据库的解决方案是使用子查询进行筛选:

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

相关问题