大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。
文章目录
前言
一、题目:1873. 计算特殊奖金
表: Employees
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| employee_id | int |
| name | varchar |
| salary | int |
+-------------+---------+
employee_id 是这个表的主键。
此表的每一行给出了雇员id ,名字和薪水。
写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,否则奖金为0。
Return the result table ordered by employee_id.
返回的结果集请按照employee_id排序。
查询结果格式如下面的例子所示。
输入:
Employees 表:
+-------------+---------+--------+
| employee_id | name | salary |
+-------------+---------+--------+
| 2 | Meir | 3000 |
| 3 | Michael | 3800 |
| 7 | Addilyn | 7400 |
| 8 | Juan | 6100 |
| 9 | Kannon | 7700 |
+-------------+---------+--------+
输出:
+-------------+-------+
| employee_id | bonus |
+-------------+-------+
| 2 | 0 |
| 3 | 0 |
| 7 | 7400 |
| 8 | 0 |
| 9 | 7700 |
+-------------+-------+
解释:
因为雇员id是偶数,所以雇员id 是2和8的两个雇员得到的奖金是0。
雇员id为3的因为他的名字以’M’开头,所以,奖金是0。
其他的雇员得到了百分之百的奖金。
二、解题
1.正确示范①
提交SQL
select employee_id,
case when employee_id%2=1 and name not like ‘M%’ then salary
else 0 end bonus
from Employees
order by employee_id;
运行结果
![](https://img-blog.csdnimg.cn/dbc6c6a4e42944c2928d8de40369b997.png)
2.正确示范②
提交SQL
select employee_id,
case when mod(employee_id,2)=1 and left(name,1)!=‘M’ then salary
else 0 end bonus
from Employees
order by employee_id;
运行结果
![](https://img-blog.csdnimg.cn/3baf43d82f434911b2f0914869eb86f7.png)
3.正确示范③
提交SQL
select employee_id,
if(mod(employee_id,2)=1 and left(name,1)!=‘M’,salary,0) bonus
from Employees
order by employee_id;
运行结果
![](https://img-blog.csdnimg.cn/b4bb4825d8454ffd9596284c72e71f1f.png)
4.正确示范④
提交SQL
select employee_id,
case when mod(employee_id,2)=0 then 0
when mod(employee_id,2)=1 and left(name,1)=‘M’ then 0
else salary end bonus
from Employees
order by employee_id;
运行结果
![](https://img-blog.csdnimg.cn/d5743023aa54413691cc815b0535c162.png)
5.其他
总结
正确示范①思路:
如果一个雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,也就是他的工资,否则奖金为0。
采用case when + %取余 + not like
case when employee_id%2=1 and name not like 'M%' then salary else 0 end
正确示范②思路:
思路同①
采用case when + mod取余 + left
case when mod(employee_id,2)=1 and left(name,1)!='M' then salary else 0 end
正确示范③思路:
思路同①
采用if + mod取余 + left
if(mod(employee_id,2)=1 and left(name,1)!='M',salary,0)
正确示范④思路:
雇员id是偶数,则奖金为0,
雇员id是奇数并且他的名字以’M’开头,则奖金为0,
否则奖金是他工资的100%
case when mod(employee_id,2)=0 then 0
when mod(employee_id,2)=1 and left(name,1)='M' then 0
else salary end