题目:
给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同)。
表: salary
employee_id 字段是表 employee 中 employee_id 字段的外键。
对于如上样例数据,结果为:
解释
在三月,公司的平均工资是 (9000+6000+10000)/3 = 8333.33…
由于部门 ‘1’ 里只有一个 employee_id 为 ‘1’ 的员工,所以部门 ‘1’ 的平均工资就是此人的工资 9000 。因为 9000 > 8333.33 ,所以比较结果是 ‘higher’。
第二个部门的平均工资为 employee_id 为 ‘2’ 和 ‘3’ 两个人的平均工资,为 (6000+10000)/2=8000 。因为 8000 < 8333.33 ,所以比较结果是 ‘lower’ 。
在二月用同样的公式求平均工资并比较,比较结果为 ‘same’ ,因为部门 ‘1’ 和部门 ‘2’ 的平均工资与公司的平均工资相同,都是 7000 。
解题思路:
建表语句:
1 Create table If Not Exists salary_615 (id int, employee_id int, amount int, pay_date date); 2 Create table If Not Exists employee_615 (employee_id int, department_id int); 3 Truncate table salary_615; 4 insert into salary_615 (id, employee_id, amount, pay_date) values ('1', '1', '9000', '2017/03/31'), ('2', '2', '6000', '2017/03/31'),('3', '3', '10000', '2017/03/31'),('4', '1', '7000', '2017/02/28'),('5', '2', '6000', '2017/02/28'),('6', '3', '8000', '2017/02/28'); 5 Truncate table employee_615; 6 insert into employee_615 (employee_id, department_id) values ('1', '1'),('2', '2'),('3', '2');
利用DATE_FORMAT() 、AVG() 、内连接JOIN ON 和 流程控制函数CASE...WHEN
①查询公司每月份的平均工资;
1 select date_format(pay_date, '%Y-%m') AS pay_month,avg(amount) as company_avg 2 from salary_615 3 group by pay_date
②查询每个部门的平均薪资;
1 select date_format(pay_date, '%Y-%m') AS pay_month,b.department_id,avg(amount) as employee_avg 2 from salary_615 a 3 join employee_615 b 4 on a.employee_id = b.employee_id 5 group by pay_month,b.department_id;
③将上面两个查询出来的数据作为两个临时表通过pay_month进行连接,然后对薪资进行判断。
1 select 2 temp1.pay_month, 3 temp2.department_id, 4 case 5 when employee_avg > company_avg then "higher" 6 when employee_avg < company_avg then "lower" 7 else 'same' 8 end as comparision 9 from ( 10 select 11 date_format(pay_date, '%Y-%m') AS pay_month, 12 avg(amount) as company_avg 13 from salary_615 14 group by pay_date 15 ) as temp1 16 join ( 17 select 18 date_format(pay_date, '%Y-%m') AS pay_month, 19 b.department_id, 20 avg(amount) as employee_avg 21 from salary_615 a 22 join employee_615 b 23 on a.employee_id = b.employee_id 24 group by pay_month,b.department_id 25 )as temp2 26 on temp1.pay_month = temp2.pay_month 27 order by temp1.pay_month desc,temp2.department_id;
小知识:
①DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据
例如:
DATE_FORMAT('2022/9/2','%Y年%m月%d日') #2022年09月02日
②AVG() 函数返回数值列的平均值
③流程控制函数CASE...WHEN:
语法一:
case 要判断的字段或表达式 when 常量1 then 要显示的值1或语句1 when 常量2 then 要显示的值2或语句2 ... else 要显示的值n或语句n end
例如:
-- 大类名是果菜的售价涨价10%,肉涨价20%,副食涨价5% SELECT `商品名称`,`进价`,`售价`, CASE 大类编码 WHEN 01 THEN 售价*1.1 WHEN 02 THEN 售价*1.2 WHEN 03 THEN 售价*1.05 ELSE 售价 END AS 新售价 FROM `商品表`;
语法二:
case when 条件1 then 要显示的值1或语句1 when 条件2 then 要显示的值2或语句2 ... else 要显示的值n或语句n end
例如:
SELECT `店号`,`商品编码`,`销售数量`, CASE WHEN `销售数量` > 250 THEN '优' WHEN `销售数量` > 150 THEN '良' WHEN `销售数量` > 100 THEN '中' ELSE '差' END AS 评级 FROM `销售表`;
标签:pay,615,力扣,date,MySQL,employee,avg,id From: https://www.cnblogs.com/liu-myu/p/17288144.html