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

文章目录

  • 1. 题目
  • 2. 题解
  • 3. 反思:GROUP BY + JOIN

1. 题目

  • 题目来源:SQL26 汇总各个部门当前员工的title类型的分配数目

  • 题目描述
    汇总各个部门当前员工的title类型的分配数目,即结果给出部门编号dept_no、dept_name、其部门下所有的员工的title以及该类型title对应的数目count,结果按照dept_no升序排序,dept_no一样的再按title升序排序

  • 三张表

  • 所需结果

2. 题解

这题还是有些看头,有不少考察点(也有不少槽点)。

主要考察:
1、多表连接:使用 INNER JOIN 找到三张表格的所有匹配项
2、分区去重(分组):使用 GROUP BY对分区对象进行分组

这题坑就坑在题目有些迷惑性,而且底下很多人给的答案也有问题。

个人解答如下:

SELECT d.dept_no, 
       d.dept_name, 
       t.title, 
       COUNT(*) count
FROM  departments d
      JOIN dept_emp de
      ON d.dept_no = de.dept_no
      JOIN titles t
      ON de.emp_no = t.emp_no
WHERE de.to_date = '9999-01-01'      # 【在职员工】这个条件不能忘
      AND t.to_date = '9999-01-01'
GROUP BY d.dept_no, d.dept_name, t.title  # 易错:也要对 title 进行分组!!(题目描述很具迷惑性)
ORDER BY d.dept_no ASC, t.title ASC

上面说很坑的原因如下:
题目所求【汇总各个部门当前员工的title类型的分配数目】,一头雾水!可能出题人也知道表述不清,后面又加以解释:【即结果给出部门编号dept_no、dept_name、其部门下所有的员工的title以及该类型title对应的数目count】,到第二遍想了好久才明白 这个 title 的 count 究竟求的是个什么,其实就可以直接理解为emp_no,即”具体的员工号“,这样就不会出现很多人答案中的COUNT(title)了。既GROUP BY title,又COUNT(title),奇怪的很。

3. 反思:GROUP BY + JOIN

做这题耗费很多时间,值得终结一下:

1、关于GROUP BY 的使用技巧:

  • ① 要快速且要找准分组的对象,看到”各个“、”每一”等关键词要敏感
  • ② 对SELECT语句的限制,后面的字段要么是分组对象要么是聚合对象,其它多余字段不允许,因此反过来,可以根据这条,来确定分组对象
    2、关于JOIN的使用:
  • ① 注意在字段前在指定特定表格
  • ② 区分左右连接: t_a LEFT JOIN t_b 表示对 t_b 进行行过滤,然后再与t_a进行列合并;而 t_a INNER JOIN t_b是互相约束,最后再做列合并

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年12月14日
下一篇 2023年12月14日

相关推荐