指摘したように、結合条件は意味がありません。従業員番号を部門番号に結合していますが、これは一致しません (または一致しますが、希望するロジックを達成しません)。
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
ここでは、男性の行に 1 回、女性の行に 1 回、合計 2 回結合し、それらに基づいて平均を計算します。OUTER 結合は、男性/女性がいない場合に使用されます。
注: 私のクエリは、男性と女性の平均を 2 列として、部門ごとに 1 つの行を返します。別の解決策は、部門ごとに 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