https://school.programmers.co.kr/learn/courses/30/lessons/284527
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 이해
주어진 문제는 HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블을 사용하여 2022년도 평가 점수가 가장 높은 사원의 정보를 조회하는 것이다. 요구사항을 정리하면 다음과 같다.
1. 2022년도의 상반기와 하반기 점수를 합산하여 총 평가 점수를 계산한다.
2. 계산된 총 평가 점수가 가장 높은 사원의 정보를 조회한다.
3. 조회할 정보는 사원의 점수, 사번, 성명, 직책, 이메일이다.
막혔던 부분
다음과 같은 코드로 집계함수를 중첩하여 코드를 작성했었는데, SQL에서는 집계함수를 중첩해서 사용할 수 없다는 사실을 알게되었다.
select max(sum(grade.score)) as SCORE, emp.emp_no, emp.emp_name, emp.position, emp.email
from HR_EMPLOYEES as emp, HR_GRADE as grade
where grade.emp_no = emp.emp_no
and grade.year = 2022
group by emp.emp_no
order by SCORE desc;
문제 풀이
이 문제를 해결하기 위한 SQL 쿼리를 단계별로 작성했다.
1. 2022년도의 평가 점수를 계산
• HR_GRADE 테이블에서 2022년도 데이터를 필터링하고, 상반기와 하반기 점수를 합산하여 총 평가 점수를 계산한다.
2. 최대 평가 점수를 가진 사원 찾기
• 계산된 총 평가 점수를 기준으로 가장 높은 점수를 가진 사원을 선택한다.
3. 사원 정보 결합
• HR_EMPLOYEES 테이블과 HR_GRADE 테이블을 조인하여 사번, 성명, 직책, 이메일 등의 사원 정보를 조회한다.
select max(sum(grade.score)) as SCORE, emp.emp_no, emp.emp_name, emp.position, emp.email
from HR_EMPLOYEES as emp, HR_GRADE as grade
where grade.emp_no = emp.emp_no
and grade.year = 2022
group by emp.emp_no
order by SCORE desc;
다른 방법으로 풀기 ( 서브쿼리 )
아까 막혔을 때 사용하려 했던 방법으로 어떻게 풀 수 있을까 고민해보다가 서브쿼리로 작성할 수 있을 것 같아 풀어봤다. 조금 번거롭지만 join으로 합쳐진 점수를 가져오고, where문을 활용해 점수가 가장 높은지를 조건으로 걸어서 풀었다.
SELECT grade.SCORE, emp.EMP_NO, emp.EMP_NAME, emp.POSITION, emp.EMAIL
FROM HR_EMPLOYEES as emp
JOIN (
SELECT EMP_NO, SUM(SCORE) AS SCORE
FROM HR_GRADE
WHERE YEAR = 2022
GROUP BY EMP_NO
) as grade
ON emp.EMP_NO = grade.EMP_NO
WHERE grade.SCORE = (
SELECT MAX(SUM_SCORE)
FROM (
SELECT SUM(SCORE) AS SUM_SCORE
FROM HR_GRADE
WHERE YEAR = 2022
GROUP BY EMP_NO
) AS MAX_SCORE
)
ORDER BY emp.EMP_NO;
'Today I Learned > SQL' 카테고리의 다른 글
[SQL] 특정 물고기를 잡은 총 수 구하기 (0) | 2024.08.14 |
---|---|
[SQLD] 엔티티 - 데이터 모델링의 이해 (0) | 2024.08.14 |
[SQLD] 모델링 - 데이터 모델링의 이해 (0) | 2024.08.12 |
[SQL] 3월에 태어난 여성 회원 목록 출력하기 (0) | 2024.08.12 |
[SQL] 연도별 평균 미세먼지 농도 조회하기 (0) | 2024.08.09 |