老规矩,在看到题目的时候,我们先想办法把题目拆解成简单的问题:
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'这个条件语句,大家也可以自己加上,虽然测试的时候,没有加上这个条件也能通过。
最后,如果我的表述中有错误的地方,欢迎大家指正!谢谢!祝大家刷题愉快!