Problem
Table: Employees
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| employee_id | int |
| name | varchar |
| salary | int |
+-------------+---------+
employee_id
is the primary key for this table.
Each row of this table indicates the employee ID, employee name, and salary.
Write an SQL query to calculate the bonus of each employee. The bonus of an employee is 100% of their salary if the ID of the employee is an odd number and the employee name does not start with the character ‘M’. The bonus of an employee is 0 otherwise.
Return the result table ordered by employee_id.
Examples
Example 1:
Input: Employees table:
+-------------+---------+--------+
| employee_id | name | salary |
+-------------+---------+--------+
| 2 | Meir | 3000 |
| 3 | Michael | 3800 |
| 7 | Addilyn | 7400 |
| 8 | Juan | 6100 |
| 9 | Kannon | 7700 |
+-------------+---------+--------+
Output:
+-------------+-------+
| employee_id | bonus |
+-------------+-------+
| 2 | 0 |
| 3 | 0 |
| 7 | 7400 |
| 8 | 0 |
| 9 | 7700 |
+-------------+-------+
Explanation: The employees with IDs 2 and 8 get 0 bonus because they have an even employee_id. The employee with ID 3 gets 0 bonus because their name starts with ‘M’. The rest of the employees get a 100% bonus.
Solution
Method 1 - If Clause
Code
SQL
SELECT employee_id,
IF(MOD(employee_id, 2) <> 0 AND name NOT LIKE 'M%', salary, 0) as bonus
FROM Employees;
Pandas
Using loc
import pandas as pd
# Create a new column 'bonus' with default value 0
employees['bonus'] = 0
# Calculate bonus based on the conditions
employees.loc[(employees['employee_id'] % 2 != 0) & (~employees['name'].str.startswith('M')), 'bonus'] = employees['salary']
# Select only the required columns and sort the result table by employee_id in ascending order
ans_df = employees[['employee_id', 'bonus']].sort_values(by='employee_id', ascending=True)
return ans_df
Using apply
import pandas as pd
def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame:
employees['bonus'] = employees.apply(lambda e: e['salary'] if int(e['employee_id']) % 2 != 0 and not e['name'].startswith('M') else 0, axis=1)
return employees[['employee_id', 'bonus']].sort_values(by='employee_id')