본문 바로가기
SQL/코딩테스트

[MySQL] 그룹화된 변수에 조건을 걸어 원하는 값 출력하기

by Nanki 2024. 11. 4.

문제 내용 : We define an employee's total earnings to be their monthly Salary X Months worked, and the maximum total earnings to be the maximum total earnings for any employee in the Employee table. Write a query to find the maximum total earnings for all employees as well as the total number of employees who have maximum total earnings. Then print these values as 2 space-separated integers.

 

해석 : 직원의 총 수입은 월 급여 X 근무 개월수로 정의하고, 최대 총 수입은 Employee 테이블에 있는 모든 직원의 최대 총 수입으로 정의합니다. 전체 직원의 최대 총 소득과 최대 총 소득을 얻은 직원의 총 수를 구하는 쿼리를 작성하세요. 그런 다음 이 값을 공백으로 구분된 2개의 정수로 인쇄합니다.

 

풀이 매크로 

1. Salary X Months = earnings 이름의 새로운 변수를 만든다. /변수생성

2. earnings별로 몇 명이 벌었는가? / GROUP BY earnings

3. earnings 중 가장 큰 값을 산출한다. / ORDER BY  earnings  DESC 이후 LIMIT 1

 

SELECT Salary*Months AS Earnings, COUNT(Employee_id)
FROM Employee
GROUP BY Earnings
ORDER BY Earnings DESC 
LIMIT 1

 

 

잘못된 풀이 과정

풀이과정 3번에서 Limit 이용안하고 HAVING과 MAX함수를 이용해 최댓값을 출력하려 했음.

Having의 경우 Group by로 그룹화된 변수에 조건을 걸 때 사용하는 것임.

Group by earnings는 서로다른 값으로 구분된 값이 하나씩 존재하는데 여기에 각각 MAX를 거니 동일한 하나의 값이 MAX값으로 출력되어 오답이 되었다.

 

SELECT salary*months AS earnings, COUNT(employee_id)
FROM Employee
GROUP BY earnings
HAVING MAX(earnings)
;

 

올바른 풀이 과정

HAVING과 MAX를 사용해서 구하려면 SELECT 절이 하나 더 필요하다.

아래처럼 서브쿼리를 넣으면 전체 earnings의 MAX값을 얻은 후 HAVING 조건문으로 활용이 가능하다.

SELECT salary*months AS earnings, COUNT(employee_id)
FROM Employee
GROUP BY earnings
HAVING earnings = (SELECT MAX(salary*months)
                   FROM Employee)
;

 

 

 

문제 출처 : https://www.hackerrank.com/challenges/earnings-of-employees/problem

 

Top Earners | HackerRank

Find the maximum amount of money earned by any employee, as well as the number of top earners (people who have earned this amount).

www.hackerrank.com