안녕하세요. Top Earners 문제 관련하여 질문 드립니다(GROUP BY, HAVING).
264
작성한 질문수 15
강사님 안녕하세요.
Top Earners(GROUP BY, HAVING) 문제 관련하여 질문드립니다.
제 생각에는 아래와 같은 쿼리로 답을 도출할 수 있을 것 같은데 의도한 대로 실행되지 않아서 질문드립니다.
SELECT months * salary as earnings
, count(*)
FROM employee
GROUP BY earnings
HAVING earnings = MAX(earnings);
earnings를 산출
earnings를 기준으로 그룹핑
earnings의 값이 최대값인 데이터만 조회
이런 생각으로 쿼리를 작성하였습니다.
그런데 최대 earnings에 해당하는 데이터만 조회되는 것이 아니라, 모든 earnings 별 데이터가 다 조회되는 것으로 나타났습니다.
어떤 이유에서 이렇게 동작한 것인지 질문드립니다.
강의 덕분에 mysql 잘 배우고 있습니다. 감사합니다.
답변 1
3
생각하신 로직에는 문제가 없으나, 이대로 작동하기 위해서는 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 공식문서를 참고하시거나 구글링 해 보시길 권해 드려요!
리트코드 1280. Students and Examinations
0
94
3
16강 LEFT JOIN 리트코드 (183. Customers Who Never Order) 관련 질문
0
103
2
African Cities 문제관련 질문
0
65
1
SQL 코딩테스트 질문
0
239
1
HACKER RANK에서 문제찾기
0
109
2
강의 자료 다운로드
0
101
2
Asian population 문제가 없어요
0
88
2
INNER JOIN 에서 A.키 쓸때 빨간 색 나오고 'dause'
0
77
2
별칭 관련해서 질문 있습니다.
0
88
2
rising temperature 문제 질문
0
108
2
해커랭크 TOP EARNERS 문제 질문
0
110
1
ON 뒤에 질문
0
106
2
INNER JOIN 질문. 강의와 결과값이 다릅니다.
0
211
3
END, 뒤에 * 붙이면 에러가 뜹니다
1
213
2
CustomerID가 중복되서 나타나요
0
242
3
별칭이 전체 테이블을 못 불러와요.
0
152
2
CASE WHEN 쿼리 오류 문의
1
342
3
CASE문제풀이 질문
0
133
1
Customers Who Never Order 풀다가 Alias관련 질문사항
0
141
1
Average Population 질문
0
143
1
Revising Aggregations - The Count Function 질문
0
110
1
Average Population of Each Continent 에대해서 질문
0
199
3
w3schools 에서 쿼리 작성 질문
0
167
1
INNER JOIN 할 때 NULL 값이 안보일 수도 있나요?
0
332
1





