方法一:
select
B.dept_no,
B.dept_name,
B.title,
count(B.title)
from
(select
A.dept_no,
A.dept_name,
title
from
(select
de.emp_no,
de.dept_no,
d.dept_name
from dept_emp de
join departments d
on de.dept_no=d.dept_no
where de.to_date='9999-01-01') A
join titles t
on A.emp_no=t.emp_no
where t.to_date='9999-01-01') B
group by B.dept_no,B.title
order by B.dept_no,B.title
本题有3个知识点:
1.group by对B.dept_no,B.title进行分组聚合,后面用order by排序;(题目要求“汇总各个部门当前员工的title类型的分配数目”,别忘了对title分组聚合,因为一个部门的员工title可能有重复)
2.至于聚合函数count(B.title)直接放select后面就行;(注意group by后加having count(B.title)=XXX这种情况是聚合分组后的条件筛选,别弄混了)
3.本题考察三层表连接,逐个嵌套,注意4点:选好select输出的字段名、区分清楚别名、选准连接键、筛选当前在职员工to_date='9999-01-01';
方法二:
select
d.dept_no,
d.dept_name,
t.title,
count(t.title)
from departments d
join dept_emp de
on d.dept_no=de.dept_no
and de.to_date='9999-01-01'
join titles t
on de.emp_no=t.emp_no
and t.to_date='9999-01-01'
group by de.dept_no,t.title
order by de.dept_no,t.title
注意:
1.from...join...on... on后面可以直接用and来筛选,作用等同于where,当然也可以换成where筛选;
2.这种方式方便快捷,直接from...join...join...连续表连接,无需多层子查询嵌套。