实际上,通过使用
MAX()
对不在group by中的列进行聚合,或将它们添加到
group by
.
我完全同意@gmb关于显式联接的观点,并且希望补充一点,您可以消除交叉联接和
employee
表使用分析进行额外扫描
count()
:
SELECT
d.dept_name,
de.dept_no,
e.gender,
count(*)/max(e.total_cnt) as Sex
FROM
(select emp_no, gender,
count(*) over() as total_cnt
from employees e ) e
INNER JOIN dept_emp de ON de.emp_no = e.emp_no
INNER JOIN departments d ON de.dept_no = d.dept_no
GROUP BY
de.dept_no,
d.dept_name,
e.gender
ORDER BY
de.dept_no;