with selected_data as(
select department,staff_gender,(normal_salary - dock_salary) as actual_salary
from staff_tb as ft
inner join salary_tb as yt on ft.staff_id = yt.staff_id
)
select
department,
round(AVG(actual_salary),2) as average_actual_salary,
ifnull(round(avg(if(staff_gender = 'male',actual_salary,null)),2),0.00) as average_actual_salary_male,
ifnull(round(avg(if(staff_gender = 'female',actual_salary,null)),2),0.00) as average_actual_salary_female
from selected_data
group by department
order by average_actual_salary desc
一开始有些手足无措,一顿库库做,被ONLY_FULL_GROUP_BY这个规则给搞不会了,忘记了非聚合列必须出现在group by中。后来只能把窗口函数AVG()over()换成聚合函数AVG()。
简单说一下这道题,核心部分在于第十行和第十一行。这两行基本一致,意思是如果性别为男(女),就计算对应实际工资平均数,然后调整为两位小数,如果为空(后来才看见的这个实例,部门里全是一种性别,就会导致另一种性别的平均工资为none,因为没有任何记录!)就默认设置为0.00。

京公网安备 11010502036488号