인프런 커뮤니티 질문&답변

김명기님의 프로필 이미지
김명기

작성한 질문수

[백문이불여일타] 데이터 분석을 위한 중급 SQL

GROUP BY 해커랭크 문제풀이

안녕하세요. Top Earners 문제 관련하여 질문 드립니다(GROUP BY, HAVING).

작성

·

225

1

강사님 안녕하세요.

Top Earners(GROUP BY, HAVING) 문제 관련하여 질문드립니다.

제 생각에는 아래와 같은 쿼리로 답을 도출할 수 있을 것 같은데 의도한 대로 실행되지 않아서 질문드립니다.

SELECT months * salary as earnings

, count(*)

FROM employee

GROUP BY earnings

HAVING earnings = MAX(earnings);

  1. earnings를 산출

  2. earnings를 기준으로 그룹핑

  3. earnings의 값이 최대값인 데이터만 조회

이런 생각으로 쿼리를 작성하였습니다.

그런데 최대 earnings에 해당하는 데이터만 조회되는 것이 아니라, 모든 earnings 별 데이터가 다 조회되는 것으로 나타났습니다.

어떤 이유에서 이렇게 동작한 것인지 질문드립니다.

강의 덕분에 mysql 잘 배우고 있습니다. 감사합니다.

답변 1

3

지식공유자 J님의 프로필 이미지
지식공유자 J
지식공유자

생각하신 로직에는 문제가 없으나, 이대로 작동하기 위해서는 HAVING 절에 수정이 필요합니다.

HAVING 절에서의 연산은 GROUP BY 에서 묶은 그룹별로 수행됩니다.
GROUP BY earnings
HAVING earnings = MAX(earnings)

이렇게 썼을 경우 MAX(earnings)는 earnings가 같은 데이터끼리 묶은 각 그룹 안에서 earnings의 최대값을 의미합니다.
그런데 earnings가 1000인 데이터끼리만 모인 그룹에서 최대값을 구하든 최소값을 구하든 1000이겠죠.
결국 HAVING 절의 의미가 1000 = 1000 인 경우를 구하라는 뜻, 즉 모든 데이터를 구하라는 뜻이 되어 모든 데이터가 조회되는 것입니다.

그룹별 MAX 값이 아니라 employee 테이블 전체에서의 MAX 값과 같은 데이터만 조회하고 싶은 것이므로
HAVING earnings = (SELECT MAX(months * salary) FROM employee)
이렇게 수정해 주셔야 합니다.
서브쿼리(쿼리 안의 다른 쿼리)를 이용한 방법인데, 저희 커리큘럼에서는 서브쿼리를 고급반에서 다루고 있습니다.
중급반에서 공부하는 내용은 아니지만 더 알고 싶으시다면 MySQL 공식문서를 참고하시거나 구글링 해 보시길 권해 드려요!

김명기님의 프로필 이미지
김명기
질문자

답변 덕분에 의문점이 해결되었습니다. 감사합니다!

김명기님의 프로필 이미지
김명기

작성한 질문수

질문하기