작성
·
141
0
강의 코드
SELECT salary * months AS earnings
,COUNT(*)
FROM employee
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1
----
내가 푼 코드
SELECT MAX(months*salary) AS max_total_earnings
,COUNT(*)
FROM employee
GROUP BY months*salary
HAVING count(*)=7
답변 1
0
안녕하세요.
이 문제에서 조회해야 하는 데이터는 가장 높은 액수의 earning과, 그만큼을 받는 직원 수인데요.
이 두 가지를 문제의 input 데이터가 아니라 다른 데이터로부터 추출할 경우가 생긴다면, 직접 작성해 주신 쿼리를 적용하기는 힘들 것 같아요.
HAVING COUNT(*) = 7 조건을 주신 것은,
이미 데이터를 이리저리 살펴보신 후에 가장 높은 액수를 받는 직원 수가 7명인 사실을 알고 계신 상태였기에 작성할 수 있으셨던 것 같아요.
그런데 다른 데이터에서는 가장 높은 액수를 받는 직원 수가 꼭 7명일 거라고는 보장할 수가 없습니다.
해당 데이터에 맞는 숫자로 바꿔서 작성하는 방법도 있겠지만, 그건 비효율적인 방법입니다.
왜냐하면 그 맞는 숫자라는 것은 사실 우리가 구해야 하는 두 가지 중 하나로, 이를 찾는 과정에서 벌써 정답의 반절을 구한 게 되거든요.
반절을 먼저 찾고 나서 이를 이용해 다시 쿼리를 짜서 남은 반절을 찾는 것보다는,
한 번에 두 가지를 같이 추출할 수 있고, 어떤 데이터에도 적용 가능한 쿼리가 더 효율적이지 않을까요?
어떤 경우에 ORDER BY, LIMIT을 쓰고 어떤 경우에 HAVING을 쓴다고 정해져 있는 것은 아니고,
보통 그 때 그 때 효율성과 가독성이 좋은 방식으로 쿼리를 작성한다는 점을 염두에 두시면 좋을 것 같아요!