题解26 | #汇总各个部门当前员工的title类型的分配数目#
汇总各个部门当前员工的title类型的分配数目
http://www.nowcoder.com/practice/4bcb6a7d3e39423291d2f7bdbbff87f8
有此题测试可知,select至少会先创建表头,不是简单意义上理解的select在order by(以及group by)后面运行,也就是说group by,order by可以根据select已经选好的表头运行。
下面两段代码均不会报错。
select a.dept_no, d.dept_name, a.title, count(t.title) as count from (select de.dept_no, t.title from dept_emp de inner join titles t on de.emp_no=t.emp_no where de.to_date='9999-01-01' and t.to_date='9999-01-01')a inner join departments d on a.dept_no=d.dept_no group by a.dept_no, d.dept_name, a.title order by a.dept_no, a.title
select a.dept_no, d.dept_name, a.title, count(title) as count from (select de.dept_no, t.title from dept_emp de inner join titles t on de.emp_no=t.emp_no where de.to_date='9999-01-01' and t.to_date='9999-01-01')a inner join departments d on a.dept_no=d.dept_no group by dept_no, dept_name, title order by dept_no, title下面代码测试得出:select的字段(d.dept_name)不经过group by 排序也没报错,可能是以为a.dept_no和d.dept_name是一一对应的吧?
select a.dept_no, d.dept_name, a.title, count(title) as count from (select de.dept_no, t.title from dept_emp de inner join titles t on de.emp_no=t.emp_no where de.to_date='9999-01-01' and t.to_date='9999-01-01')a inner join departments d on a.dept_no=d.dept_no group by dept_no, title order by dept_no, title补充一下别人的笔记
用了GROUP BY语句和聚合函数COUNT()。GROUP BY de.dept_no, t.title说明这两个字段都一样的记录才分到一组,而COUNT(t.title)其实是统计记录数,换成COUNT(*)也是一样的,用COUNT(t.title)是为了突出重点。聚合函数是多输入单输出的函数,类似的还有MAX()、MIN()、SUM(),所以出现了原来两条记录,输出只有一条记录的情况