Average Salary: Departments VS Company Problem


Description

LeetCode Problem 615.

Given two tables as below, write a query to display the comparison result (higher/lower/same) of the average salary of employees in a department to the company’s average salary.

Table: salary

1
2
3
4
5
6
7
8
| id | employee_id | amount | pay_date   |
|----|-------------|--------|------------|
| 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 |

The employee_id column refers to the employee_id in the following table employee.

1
2
3
4
5
| employee_id | department_id |
|-------------|---------------|
| 1           | 1             |
| 2           | 2             |
| 3           | 2             |

So for the sample data above, the result is:

1
2
3
4
5
6
| pay_month | department_id | comparison  |
|-----------|---------------|-------------|
| 2017-03   | 1             | higher      |
| 2017-03   | 2             | lower       |
| 2017-02   | 1             | same        |
| 2017-02   | 2             | same        |

Explanation

In March, the company’s average salary is (9000+6000+10000)/3 = 8333.33…

The average salary for department ‘1’ is 9000, which is the salary of employee_id ‘1’ since there is only one employee in this department. So the comparison result is ‘higher’ since 9000 > 8333.33 obviously.

The average salary of department ‘2’ is (6000 + 10000)/2 = 8000, which is the average of employee_id ‘2’ and ‘3’. So the comparison result is ‘lower’ since 8000 < 8333.33.

With he same formula for the average salary comparison in February, the result is ‘same’ since both the department ‘1’ and ‘2’ have the same average salary with the company, which is 7000.


MySQL Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
select department_salary.pay_month, department_id,
    case
        when department_avg>company_avg then 'higher'
        when department_avg<company_avg then 'lower'
        else 'same'
    end as comparison
from
    (
      select department_id, avg(amount) as department_avg, date_format(pay_date, '%Y-%m') as pay_month
      from salary join employee on salary.employee_id = employee.employee_id
      group by department_id, pay_month
    ) as department_salary
join
    (
      select avg(amount) as company_avg,  date_format(pay_date, '%Y-%m') as pay_month 
        from salary 
        group by date_format(pay_date, '%Y-%m')
    ) as company_salary
on department_salary.pay_month = company_salary.pay_month




Related Posts

Students Report By Geography Problem

LeetCode 618. A U.S graduate school has students from Asia,...

Average Salary: Departments VS Company Problem

LeetCode 615. Given two tables as below, write a query...

Second Degree Follower Problem

LeetCode 614. Please write a sql query to get the...

Shortest Distance In A Plane Problem

LeetCode 612. Write a query to find the shortest distance...

Triangle Judgement Problem

LeetCode 610. A pupil Tim gets homework to identify whether...

Shortest Distance Problem

LeetCode 613. Write a query to find the shortest distance...