携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
一、题目
表: 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排序。
查询结果格式如下面的例子所示。
示例 1:
输入: 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。 其他的雇员得到了百分之百的奖金。
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
创建数据表
根据题意和数据类型创建数据表
CREATE TABLE Employees(
employee_id INT PRIMARY KEY,
NAME VARCHAR(20),
salary INT
);
INSERT INTO Employees VALUES
(2,"Meir",3000),
(3,"Michael",3800),
(7,"Addilyn",7400),
(8,"Juan",6100),
(9,"Kannon",7700);
- 填充数据如下
条件查询
这里条件是如果一个雇员的id是奇数并且他的名字不是以'M'开头,那么他的奖金是他工资的100%,否则奖金为0。
// 查询条件 id为奇数
SELECT employee_id, salary bonus FROM Employees WHERE Employees.employee_id % 2 != 0;
SELECT employee_id, salary bonus FROM Employees WHERE MOD(employee_id,2)!=0;
// 名字不是以M开头的
SELECT employee_id, salary bonus FROM Employees WHERE Employees.name NOT LIKE("M%");
SELECT employee_id, salary bonus FROM Employees WHERE LEFT(NAME,1)!= 'M';
同时这里要给奖金,奖金的规则是如果满足上述条件则给工资的100%,否则为0,这里要多重判断
SELECT employee_id,
(CASE WHEN MOD(employee_id,2)!=0 AND LEFT(NAME,1)!='M' THEN salary
WHEN MOD(employee_id,2)=0 OR LEFT(NAME,1)='M' THEN 0
END) bonus
FROM Employees
ORDER BY employee_id
三、测试结果
测试结果显示
四、总结
case when then end该语句使用与一个条件判断有多种值得情况下分别执行不同的操作
CASE <单值表达式>
WHEN <表达式值> THEN <SQL语句或者返回值>
WHEN <表达式值> THEN <SQL语句或者返回值>
...
WHEN <表达式值> THEN <SQL语句或者返回值>
ELSE <SQL语句或者返回值>
END