题目:

给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同)。

表: 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 `销售表`;

力扣615(MySQL)-平均工资:部门与公司比较(困难)的更多相关文章

  1. mysql查询之部门工资最高的员工

    最近发现一个网站 力扣 查看 上面有很多算法和数据库的题目,做了一下,发现自己平时都疏忽了,因此边做边记录下来 Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 de ...

  2. 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

     1组函数 avg(),sum(),max(),min(),count()案例: selectavg(sal),sum(sal),max(sal),min(sal),count(sal) from ...

  3. pl/sql 过程 函数(写一个过程,输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金))

    1.编写过程,输入三角形三个表的长度.在控制台打印三角形的面积. create or replace procedure pro_s(v_a number,v_b number,v_c number) ...

  4. oracle中pl/sql 练习题----输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)

    一. 思路:声明record类型的变量,根据 多表联合查询查出想要的数据,最后输出. 二.注意:record类型不一定只是一个表中的数据,也可以声明不同表中的数据类型. 三.语句如下: declare ...

  5. 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨

    题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...

  6. 力扣---1148. 文章浏览 I

    Views 表:+---------------+---------+| Column Name   | Type    |+---------------+---------+| article_i ...

  7. 力扣---511. 游戏玩法分析 I

    活动表 Activity: +--------------+---------+| Column Name  | Type    |+--------------+---------+| player ...

  8. 2018java平均工资,想转行学java的快点上车

    很多人选择工作的原因很简单:要么有钱,要么自己开心,当然绝大多数人是既没有钱也不开心...(现实就是这么残酷).哪有钱多事少的活,请告诉我,我第一个去!!我想大部分人对java充满好奇的一个原因就是钱 ...

  9. SQL-54 查找排除当前最大、最小salary之后的员工的平均工资avg_salary。

    题目描述 查找排除当前最大.最小salary之后的员工的平均工资avg_salary.CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL,`sala ...

  10. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

随机推荐

  1. Android Studio安装插件重启插件消失

    问题 安装插件后,已经提示让重启IDE,但是重启后发现插件是安装失败了 解决方法 原因是自己改了配置,如果下载的插件是jar包,则可以安装,如果是zip压缩文件的插件,则是要我们手动解压一下 我上面的 ...

  2. 14_编译FFmpeg

    本文来详细讲解一下:如何在Mac.Windows环境下成功编译FFmpeg. 目标 这里先提前说明一下,最后希望达到的效果: 编译出ffmpeg.ffprobe.ffplay三个命令行工具 只产生动态 ...

  3. C++11 中运行代码块耗时的方法以及坑(chrono 方法)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. AntSK 0.2.1 版本揭秘:动态加载dll,驱动Function Call新境界!

    在.NET的无限宇宙中,动态加载dll似乎一直是操控代码生生不息的魔杖.今天,我将与您探讨如何通过AntSK 0.2.1 版本灵活运用dll,将Function Call的强大功能插拔自如地融入项目之 ...

  5. 虚拟现实(VR)在医疗保健中的5种应用

    医疗保健中的VR虚拟现实 虚拟现实的由来已久,18世纪,法国的医生使用布制的分娩模拟器向助产师和外科医生教授医学技术.在20世纪60年代初,医生一边对心肺复苏学员口述心肺复苏的技巧,一边使用一家塑料玩 ...

  6. 深入浅出Java多线程(十三):阻塞队列

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十三篇内容:阻塞队列.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在多线程编程的世界里,生产者-消费者问 ...

  7. 三维模型OBJ格式轻量化的跨平台兼容性问题分析

    三维模型OBJ格式轻量化的跨平台兼容性问题分析 三维模型的OBJ格式轻量化在跨平台兼容性方面具有重要意义,可以确保模型在不同平台和设备上的正确加载和渲染.本文将分析OBJ格式轻量化的跨平台兼容性技术, ...

  8. 记录--关于前端的音频可视化-Web Audio

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 最近听音乐的时候,看到各种动效,突然好奇这些音频数据是如何获取并展示出来的,于是花了几天功夫去研究相关的内容,这里只是给大家一些代码 ...

  9. Elastic实战:彻底解决spring-data-elasticsearch日期、时间类型数据读取报错问题

    0. 引言在使用spring-data-elasticsearch读取es中时间类型的数据时出现了日期转换报错,不少初学者会在这里困惑很久,所以今天我们专门来解读该问题的几种解决方案. 1. 问题分析 ...

  10. 靶场搭建----phpstudy2018安装及注意问题

    安装 官网下载: https://www.xp.cn/download.html 新人推荐2018 版本phpstudy 介绍 系统服务------开机自启 非服务模式------开机不自启 搭建好环 ...