题解 | #汇总各个部门当前员工的title类型的分配数目#

汇总各个部门当前员工的title类型的分配数目

http://www.nowcoder.com/practice/4bcb6a7d3e39423291d2f7bdbbff87f8

老规矩,在看到题目的时候,我们先想办法把题目拆解成简单的问题:
1、先查找每个员工对应的部门编号及部门名称
2、查找每一个部门的职称类型
3、计算出每个部门每种职称的数量
上述的步骤,也许看起来有些繁琐,但这是为了让大家看得更加明白。
废话不多说,直接上代码分析:
首先,参考题目,我在数据库中构造了三张表
部门表
部门表

员工表
图片说明

职称表
图片说明
有了这三张表,我们来开始解决第一个小问题:
1、查找每个员工对应的部门编号及部门名称
联系 departments表 和 dept_emp表 我们即可得到相应的数据:

select e.emp_no,d.dept_no,d.dept_name from dept_emp e JOIN departments d on e.dept_no = d.dept_no;

查询结果如下:
我们暂且称之为 t1表
图片说明
2、查找每一个部门的职称类型

select t1.dept_no,t1.dept_name,t2.title from 
(select e.emp_no,d.dept_no,d.dept_name from dept_emp e JOIN departments d on e.dept_no = d.dept_no) t1 
JOIN titles t2
on t1.emp_no = t2.emp_no  ORDER BY t1.dept_no;

解释:t1 即为我们第一个小问题中查询得到的数据,将其看成一个临时表。要得到职称,就必须查询titles表。联系 t1 表 和 titles 表 即可得到问题的结果。
查询结果如下:
部门的职称
图片说明
这里,我们暂时还未对职称进行归类。如表中 d001部门出现了两个职称名为 staff 的数据
因此,我们要进行归类,合并查询结果,这也是第三个小问题,即题目最终的要求。

select t1.dept_no,t1.dept_name,t2.title,COUNT(t2.title) count from (select e.emp_no,d.dept_no,d.dept_name from dept_emp e JOIN departments d on e.dept_no = d.dept_no) t1 
JOIN titles t2
on t1.emp_no = t2.emp_no  GROUP BY t1.dept_no,t2.title ORDER BY t1.dept_no;

解释:在上述代码的最后,我们对数据按部门以及职称进行分组
注意,这里必须是部门和职称同时分组,否则结果不正确。
查询结果:
最终结果
图片说明
总结:对于这类题目,大都是几张表的联合查询,也这几张表不一定就是题目所给的数据表,也有可能是我们在查询过程中产生的数据表。因此,我们要学会如何去拆解题目,得到我们想要的临时表,再利用临时表,来查询获得我们想要的数据。
补充说明:在查询过程中,我的代码中并未加入 where to_date = '9999-01-01'这个条件语句,大家也可以自己加上,虽然测试的时候,没有加上这个条件也能通过。
最后,如果我的表述中有错误的地方,欢迎大家指正!谢谢!祝大家刷题愉快!

全部评论

相关推荐

点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务