Tác giả: Lê Trung Kiên lớp java 08
Email: lekien.2803.cg@gmail.com
SĐT: 0942096947
Link bài toán: https://leetcode.com/problems/calculate-special-bonus/

1. Mở đầu

Xin chào các bạn, mình viết ra bài viết này để chia sẻ phương pháp giải cũng như tư duy của mình về bài toán này của leetcode. Phương pháp của mình có thể không phải là tối ưu nhất, tuy nhiên mình sẽ phân tích, chia nhỏ bài toán ra thành các module nhỏ hơn để dễ giải quyết cũng như giúp các bạn hiểu được các yêu cầu mà bài toán đưa ra.

2. Đề bài

Cho bảng Employees:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
| salary      | int     |
+-------------+---------+
employee_id là khóa chính của bảng.
Mỗi hàng của bảng này cho biết ID nhân viên, tên nhân viên và mức lương.

Viết câu truy vấn SQL để tính tiền thưởng của từng nhân viên. Tiền thưởng của nhân viên là 100% lương nếu ID của nhân viên là số lẻtên của nhân viên không bắt đầu bằng ký tự ‘M’. Tiền thưởng của một nhân viên là 0 trong các trường hợp còn lại.
Trả về bảng kết quả sắp xếp theo employee_id tăng dần.
Định dạng kết quả truy vấn nằm trong ví dụ sau.

Ví dụ 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.

3. Phân tích

Đọc qua thì có thể thấy công ty này phát thưởng hơi phân biệt đối xử, đặc biệt với người có id là số chẵn và ông nào bà nào có tên bắt đầu bằng chữ 'M'.
Đùa chút thôi, mục đích của bài tập này là giúp các bạn lọc ra được dữ liệu cần thiết bằng các câu truy vấn. Ở ví dụ trên chúng ta thấy, cứ ông nào mà có id là số chẵn thì không được thưởng. Kể cả ông có số id = 3 tuy là số lẻ nhưng tên của ông bắt đầu bằng chữ 'M' nên là thôi không có thưởng gì nhé.
Vậy thì chúng ta cần một câu điều kiện IF để có thể lọc ra được những dữ kiện như trên. Điều kiện sẽ phải đáp ứng hai điều, id phải là số lẻ và tên của nhân viên không được bắt đầu bằng chữ 'M' thì mới cho thưởng. Vì thưởng là 100% nên ta chỉ cần lấy nguyên giá trị từ cột salary là được.
Xong thì nhớ sắp xếp bảng kết quả theo yêu cầu đề bài nhé.

4. Code luôn cho nóng

Code của chúng ta sẽ như sau:

select employee_id, if(employee_id %2 <> 0 and name not like 'M%', salary, 0) bonus
from employees
order by employee_id asc

5. Kết thúc

Qua bài viết này, mình đã chia sẻ cho các bạn cách mình tư duy khi giải bài tập trên leetcode. Hi vọng bài viết giúp ích cho các bạn trong cách tư duy để giải các bài tập khác. Xin cám ơn các bạn đã dành thời gian đọc và theo dõi. Peace!!!