正如所指出的,您的加入条件没有意义,您正在将员工编号加入部门编号,这将不匹配(或将,但不会实现您想要的逻辑)。
SELECT
d.name
, AVG(e_man.salary) avg_man
, AVG(e_woman.salary) avg_woman
FROM department d
LEFT OUTER JOIN employee e_man ON e_man.deptNo = d.deptNo AND e_man.sex = 'm'
LEFT OUTER JOIN employee e_woman ON e_woman.deptNo = d.deptNo AND e_woman.sex = 'f'
GROUP BY d.name
在这里,您加入两次,一次加入男性行,一次加入女性行,并根据它们计算平均值。如果没有任何男性/女性,则使用外部连接。
注意:我的查询将为每个部门返回一行,男性和女性的平均值为 2 列。替代解决方案是为每个部门返回 0-2 行,每个性别有单独的行,并列出每行/性别的相关薪水。
编辑:人们似乎非常不满意的替代子查询解决方案。根据我的经验,有时子查询是正确的答案,有时连接是正确的答案,只要不牺牲性能,您通常会使用最适合您的逻辑目标/表示的任何一个。无论如何,您正在使用的 RDBMS 的优化器通常会重写它。与往常一样,最好检查计划并查看发生了什么。
SELECT
d.name
, (
SELECT AVG(e1.salary)
FROM employee e1
WHERE e1.sex = 'm'
AND e1.deptNo = d.deptNo
) avg_man
, (
SELECT AVG(e2.salary)
FROM employee e2
WHERE e2.sex = 'f'
AND e2.deptNo = d.deptNo
) avg_woman
FROM department d