26

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

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

题目:汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count,当前是指’9999-01-01’
隐含要求:dept_no按照升序排列

错误示范:SELECT里面的子查询出现了两个列:title和count()
SELECT d.dept_no, d.dept_name,
(SELECT t.title, count(
)
FROM dept_emp AS de
INNER JOIN titles AS t
ON de.emp_no=t.emp_no
WHERE de.to_date='9999-01-01'
AND t.to_date='9999-01-01'
AND de.dept_no=d.dept_no
GROUP BY t.title
)
FROM departments AS d

错误示范:虽然SELECT里面的子查询只出现了一个列:count(),但是子查询会返回多个值,所以仍然不可行(必须只返回单值)
SELECT d.dept_no, d.dept_name,
(SELECT count(
)
FROM dept_emp AS de
INNER JOIN titles AS t
ON de.emp_no=t.emp_no
WHERE de.to_date='9999-01-01'
AND t.to_date='9999-01-01'
AND de.dept_no=d.dept_no
GROUP BY t.title
)
FROM departments AS d

改进版本:我感觉是对的,在mysql中运行的结果也没问题,但是在题库中无法通过(标黄为核心代码)
SELECT DISTINCT d.dept_no, d.dept_name, t.title,
(SELECT COUNT(*)
FROM dept_emp AS de2
INNER JOIN titles AS t2
ON de2.emp_no=t2.emp_no
WHERE de2.to_date='9999-01-01'
AND t2.to_date='9999-01-01'
AND de2.dept_no=d.dept_no
AND t2.title=t.title) AS 'count'
FROM departments AS d, dept_emp AS de, titles AS t
WHERE d.dept_no=de.dept_no
AND de.emp_no=t.emp_no
AND de.to_date='9999-01-01'
AND t.to_date='9999-01-01'
ORDER BY d.dept_no;
注意:这个DISTINCT特别容易忽略
mysql运行结果:
+---------+--------------------+-----------------+-------+
| dept_no | dept_name | title | count |
+---------+--------------------+-----------------+-------+
| d001 | Marketing | Senior Engineer | 1 |
| d001 | Marketing | Staff | 1 |
| d002 | Finance | Senior Engineer | 1 |
| d003 | Human Resources | Senior Staff | 1 |
| d004 | Production | Senior Engineer | 2 |
| d005 | Development | Senior Staff | 1 |
| d006 | Quality Management | Engineer | 2 |
| d006 | Quality Management | Senior Engineer | 1 |
+---------+--------------------+-----------------+-------+

能通过题库的方法:GROUP BY dept_no和title
SELECT d.dept_no, d.dept_name, t.title, COUNT(*) AS count
FROM departments AS d, dept_emp AS de, titles AS t
WHERE d.dept_no=de.dept_no
AND de.emp_no=t.emp_no
AND de.to_date='9999-01-01'
AND t.to_date='9999-01-01'
GROUP BY d.dept_no, t.title;
补充:WHERE的三表联查也可以改成两个内连接
mysql运行结果:
+---------+--------------------+-----------------+-------+
| dept_no | dept_name | title | count |
+---------+--------------------+-----------------+-------+
| d001 | Marketing | Senior Engineer | 1 |
| d001 | Marketing | Staff | 1 |
| d002 | Finance | Senior Engineer | 1 |
| d003 | Human Resources | Senior Staff | 1 |
| d004 | Production | Senior Engineer | 2 |
| d005 | Development | Senior Staff | 1 |
| d006 | Quality Management | Engineer | 2 |
| d006 | Quality Management | Senior Engineer | 1 |
+---------+--------------------+-----------------+-------+

全部评论
select dm.dept_no,dm.dept_name,t.title,count(t.title) count from dept_emp de join titles t on t.emp_no = de.emp_no and t.to_date = '9999-01-01' join departments dm on de.dept_no = dm.dept_no and de.to_date = '9999-01-01' group by dm.dept_no,t.title order by dm.dept_no;
1 回复 分享
发布于 2021-01-05 09:46
deptname不在分组字段里,系统不会报错吗?
点赞 回复 分享
发布于 2021-12-14 14:59
错误示范里select里的子查询为啥不能返回两个列和一个列啊,这个为什么错误呢
点赞 回复 分享
发布于 2021-06-04 22:35
为什么一定要有这一句:WHERE de.to_date='9999-01-01' AND t.to_date='9999-01-01'
点赞 回复 分享
发布于 2021-02-20 20:09

相关推荐

吴offer选手:我卡在笔试才是最好笑的,甚至没给我发过笔试链接
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务