题目:现在有员工表和部门表,选出每个部门中薪资前三的员工的具体信息。具体表结构如下:
员工表:
部门表:
最终SQL如下:
GROUP BY
dep.id ,emp.id,emp.name ,emp.salary,dep.name
HAVING COUNT(*)<=3
ORDER BY
emp.departmentId , emp.salary ;
查询结果如下:
分析:
SELECT
emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName
FROM
tb_employee emp ,tb_employee emp1, tb_department dep
WHERE
emp.salary <=emp1.salary
AND emp.departmentId = emp1.departmentId
AND emp.departmentId = dep.id
的查询结果为:
这个很难看出甚麽来,我们在查询结果中添加两列:
SELECT
emp.id , emp.name ,emp.salary, emp1.name as name1, emp1.salary as salary1, dep.id as depId , dep.name as depName
FROM
tb_employee emp ,tb_employee emp1, tb_department dep
WHERE
emp.salary <=emp1.salary
AND emp.departmentId = emp1.departmentId
AND emp.departmentId = dep.id
查询结果如下:
可以看出,这其实就是一个自连接查询。
由于要找出每个部门中薪资最高的员工的信息,故要进行分组操作。
SELECT
emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName
FROM
tb_employee emp ,tb_employee emp1, tb_department dep
WHERE
emp.salary <=emp1.salary
AND emp.departmentId = emp1.departmentId
AND emp.departmentId = dep.id
GROUP BY
dep.id ,emp.id,emp.name ,emp.salary,dep.name
查询结果如下:
这里需要注意一点:group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。
添加HAVING COUNT(*)<=3,表示,在指定的一个部门中,工资大于或者等于该员工的工资的人数不大于3,即该员工工资处于该部门的前三的最后一名(如果该部门只有两名员工,则为第二名,如果只有一名员工,则为第一名).
查询结果为:
故最后SQL语句为:
SELECT
emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName
FROM
tb_employee emp ,tb_employee emp1, tb_department dep
WHERE
emp.salary <=emp1.salary
AND emp.departmentId = emp1.departmentId
AND emp.departmentId = dep.id
GROUP BY
dep.id ,emp.id,emp.name ,emp.salary,dep.name
HAVING COUNT(*)<=3
ORDER BY
emp.departmentId , emp.salary desc;
注:该题目来自于
https://oj.leetcode.com/problems/department-top-three-salaries/
答案参考于
http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000006875
- 大小: 13.4 KB
- 大小: 6.7 KB
- 大小: 10.7 KB
- 大小: 18.1 KB
- 大小: 19.9 KB
- 大小: 11.2 KB
- 大小: 10.3 KB
分享到:
相关推荐
*某班在进行选举,现有5名同学参加选举,要从中选出得票最多的前三名同学。编程完成: 1)、输入五个同学的名字并显示格式如下: ************************************************* (1、赵** 2、钱** 3、孙** 4、...
从1到x这x个数字中选出n个,排成一列,相邻两数不能相同,求所有可能的排法
键盘上接受三个数,选出大于平均数的数据显示出来键盘上接受三个数,选出大于平均数的数据显示出来键盘上接受三个数,选出大于平均数的数据显示出来键盘上接受三个数,选出大于平均数的数据显示出来
只用三行代码就从一千个数字随机选出了一百个不同的数字!
饿了么联合点餐系统,可统计每份菜多少份,并自动选出最高优惠的订单和每个人应付的钱。eleme_union_meal是一个B/S结构的软件,它能收集用户在饿了么下的订单,计算出最优惠的价格下单
选出画线部分读音及其余三个不同的单词.doc
选出画线部分读音与其余三个不同的单词.doc
随机生成若干个数,用快速排序选出第K个数
裁判员先在小键盘的0-F 之间选中一个数,每一次游戏选手有三次机会,当选手选出一个数后,程序会在点阵显示屏上显示提示语言,如:该数与裁判员选定的数相比是“大”、“小”还是“√”。在游戏过程中还需要采用定时...
最快的排序算法 算法:从25匹马中选出最快的三匹马,排序算法数据结构
多项选择题在每小题的五个备选答案中选出二至五个正.pdf
通达信缠论笔段中枢+三类买卖点选股,通达信缠论指标选出盘整股票源码
在实际课题中,为了全面分析问题,往往提出很多与此有关的变量(或因素),因为每个变量都在不同程度上反映这个课题的某些信息。主成分分析首先是由K.皮尔森对非随机变量引入的,尔后H.霍特林将此方法推广到随机向量...
在输入大量单词时找出出现单词次数最多的那个单词,如果出现一样多,则是最后一个
从键盘中任意选出6个键作为系统的功能键和LED数码显示一起组成一个单片机键盘显示系统(小的监控程序),并通过实验箱上的接口芯片实现相应的功能(注:这些硬件电路全在实验箱上,但自己要能设计)。要求设计相应...
通达信指标公式源码倍量副图指标 选出超级大牛.pdf通达信指标公式源码倍量副图指标 选出超级大牛.pdf通达信指标公式源码倍量副图指标 选出超级大牛.pdf通达信指标公式源码倍量副图指标 选出超级大牛.pdf通达信指标...
Description 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从...对应每组测试数据,每行输出的是计算出的最大值。 Sample Input 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Sample Output 30
5、对于问题点较多的且长期不改善的部门,发“5S改善通知书”给部门主管,要求他们在三天内改善,如果三天后再次检查发现问题点还没有改善,每个问题点扣2分,并罚部门主管。 8、评比 每月一次 1、5S评比,每月一次...