문제 내용 : 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
'SQL > 코딩테스트' 카테고리의 다른 글
[MySQL] Self join을 활용한 코딩테스트 주의사항 (0) | 2024.11.05 |
---|---|
[MySQL] Self Join (0) | 2024.11.05 |
[MySQL] 그룹변수가 2개로 피벗테이블 구성 (0) | 2024.11.05 |
[MySQL] SQL로 피벗테이블 만드는 순서(데이터 피봇팅) (0) | 2024.11.05 |
[MySQL] CASE 문에서 WHEN 순서의 중요성 (0) | 2024.11.04 |