✍ 제 머리로 코드를 짜내기 위한 챌린지입니다. (그동안 습관적으로 discussion창을 보곤 했거든요..)
🚀 이 포스팅 보신분 챌린지에 함께해요🤗 (함께하면 기쁨도 두 배! 서로 온라인 메이트가 되어보아요.)
[문제]
[Top Earners]
|
[풀이]
[Oracle]
SELECT *
FROM (SELECT MONTHS * SALARY, COUNT(EMPLOYEE_ID)
FROM EMPLOYEE
GROUP BY MONTHS * SALARY
ORDER BY MONTHS * SALARY DESC
)
WHERE ROWNUM = 1;
✍ 서브 쿼리를 사용한 이유가 무엇일까?
✍ 이런 계산을 위해선 서브쿼리를 써야한다는 것은 아는데, 왜 써야하는지... 생각을 안해봤다. (서브쿼리 추가 공부)
✍ 일단, 급여와 직원수를 알기 위해 서브 쿼리 SELECT 절에 그에 맞는 출력형식을 작성한다.
✍ 그리고 급여가 같은 직원들을 그룹으로 묶기 위해(나중에 급여가 가장 많은 직원들을 한꺼번에 출력해야 하기 때문에) GROUP BY 수행
✍ 급여가 가장 많은 그룹을 가장 상단으로 배치하기 위해 ORDER BY에 내림차순(DESC) 수행
✍ 본 쿼리의 WHERE 절에 가장 첫번째 행을 출력하는 ROWNUM=1 수행
[MySQL]
SELECT (Months * Salary)as earnings , Count(*)
FROM Employee
GROUP BY 1
ORDER BY earnings DESC
limit 1;
✍ MySQL 쿼리도 살펴봤다.
✍ 서브쿼리를 사용하지 않아서 oracle 보다 훨씬 간단해보인다.
✍ oracle의 서브쿼리와 거의 유사한데, MySQL은 GROUP BY에 SELECT에 출력되는 값의 순서에 따라 이름을 지정할 수 있다.
✍ GROUP BY 1 이라함은 months*salary의 alias인 earnings를 뜻한다.
✍ limit 1 또한 oracle의 where절에 작성하는 rownum = 1과 같은 의미다.
'SQL' 카테고리의 다른 글
[SQL 챌린지] 해커랭크 정복하기 Day 9 (0) | 2021.03.11 |
---|---|
[SQL 챌린지] 해커랭크 정복하기 Day 9 (0) | 2021.03.11 |
[SQL 챌린지] 해커랭크 정복하기 Day 8 (0) | 2021.03.05 |
[SQL 챌린지] 해커랭크 정복하기 Day 7 (0) | 2021.03.03 |
[SQL 챌린지] 해커랭크 정복하기 Day 6 (0) | 2021.03.02 |