with total as ( select department, round(avg(normal_salary - dock_salary), 2) as average_actual_salary from staff_tb st join salary_tb sl on st.staff_id = sl.staff_id group by department ), male_total as ( select department, round(avg(normal_salary - dock_salary), 2) as average_actual_salary_male from staff_tb st join salary_tb sl on st.staff_id = sl.staff_id where staff_gender = 'male' group by department ), female_total as ( select department, round(avg(normal_salary - dock_salary), 2) as average_actual_salary_female from staff_tb st join salary_tb sl on st.staff_id = sl.staff_id where staff_gender = 'female' group by department )
先建立三个临时表,分别计算总平均工资,男平均工资和女平均工资,当然会存在可能某个性别为空的情况,这里不用管。
select t.department, average_actual_salary, ifnull(average_actual_salary_male, 0.00) as average_actual_salary_male, ifnull(average_actual_salary_female, 0.00) as average_actual_salary_female from total t left join male_total m on t.department = m.department left join female_total f on t.department = f.department order by average_actual_salary desc;
然后用left join连接三个表,不能用join,因为如果某个性别为空的话,那一整个部门就会不显示出来,然后再用ifnull判断,如果为空就显示0.00。思路清晰。