👇 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🔓 문제 설명
HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블을 이용해 사원별 성과금 정보를 조회하려합니다.
평가 점수별 등급과 등급에 따른 성과금 정보가 아래와 같을 때, 사번, 성명, 평가 등급, 성과금을 조회하는 SQL문을 작성해주세요.
(평가 점수 = 평균 SCORE)
평가등급의 컬럼명은 GRADE로, 성과금의 컬럼명은 BONUS로 해주세요.
결과는 사번 기준으로 오름차순 정렬해주세요.
기준 점수평가 등급성과금(연봉 기준)
| 기준 점수 | 평가 등급 | 성과금(연봉 기준) |
| 96 이상 | S | 20% |
| 90 이상 | A | 15% |
| 80 이상 | B | 10% |
| 이외 | C | 0% |
예시 문제 데이터
[HR_EMPLOYEES]
| EMP_NO | EMP_NAME | DEPT_ID | POSITION | COMP_TEL | HIRE_DATE | SAL | |
| 2017002 | 정호식 | D0001 | 팀장 | hosick_jung@grep.com | 031-8000-1101 | 2017-03-01 | 65000000 |
| 2018001 | 김민석 | D0001 | 팀원 | minseock_kim@grep.com | 031-8000-1102 | 2018-03-01 | 60000000 |
| 2019001 | 김솜이 | D0002 | 팀장 | somi_kim@grep.com | 031-8000-1106 | 2019-03-01 | 60000000 |
| 2020002 | 김연주 | D0002 | 팀원 | yeonjoo_kim@grep.com | 031-8000-1107 | 2020-03-01 | 53000000 |
| 2020005 | 양성태 | D0003 | 팀원 | sungtae_yang@grep.com | 031-8000-1112 | 2020-03-01 | 53000000 |
[HR_GRADE]
| EMP_NO | YEAR | HALF_YEAR | SCORE |
| 2017002 | 2022 | 1 | 92 |
| 2018001 | 2022 | 1 | 89 |
| 2019001 | 2022 | 1 | 94 |
| 2020002 | 2022 | 1 | 90 |
| 2020005 | 2022 | 1 | 92 |
| 2017002 | 2022 | 2 | 84 |
| 2018001 | 2022 | 2 | 89 |
| 2019001 | 2022 | 2 | 81 |
| 2020002 | 2022 | 2 | 91 |
| 2020005 | 2022 | 2 | 81 |
⚡SQL Query
내가 작성한 답(MySQL & Oracle)
SELECT E.EMP_NO AS EMP_NO,
E.EMP_NAME AS EMP_NAME,
G.GRADE AS GRADE,
CASE
WHEN G.GRADE = 'S' THEN E.SAL * 0.2
WHEN G.GRADE = 'A' THEN E.SAL * 0.15
WHEN G.GRADE = 'B' THEN E.SAL * 0.1
ELSE 0
END AS BONUS
FROM HR_EMPLOYEES E JOIN (
SELECT EMP_NO, YEAR,
CASE
WHEN AVG(SCORE) >= 96 THEN 'S'
WHEN AVG(SCORE) >= 90 THEN 'A'
WHEN AVG(SCORE) >= 80 THEN 'B'
ELSE 'C'
END AS GRADE
FROM HR_GRADE
GROUP BY EMP_NO, YEAR
) G ON E.EMP_NO = G.EMP_NO
ORDER BY EMP_NO ASC
🔎 풀이 설명
1. 인라인 뷰
- 서브쿼리에서 사원의 등급을 결정하여 조인을 진행 했습니다.
2. 보너스 연산
- 각 등급에 맞는 보너스를 연봉에 백분율을 곱해서 성과금을 구했습니다.
3. 정렬
💡인사이트
1. CASE WHEN 중복 사용
CASE
WHEN AVG_SCORE >= 96 THEN SAL * 0.2
...
- 작성된 SQL은 위 아래에서 CASE문을 두 번을 사용하였지만 인라인 뷰에서 평균 점수만 계산한 후 바깥 쿼리에서 GRADE와 BOUNS를 한 번에 처리하는 것이 가독성 면에서 좋을 수 있습니다.
2. 조인 부하 최소화
- 조인 후 집계: HR_EMPLOYEES(5만 명)와 HR_GRADE(상/하반기 10만 건)를 먼저 조인하면, 조인 연산 자체가 10만 번 발생합니다.
- 집계 후 조인: HR_GRADE에서 먼저 사원별 평균을 구해 5만 건으로 압축한 뒤 조인합니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| [Oracle] SQL 수행 구조 (1) | 2026.04.27 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(JOIN) (1) | 2026.04.23 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 언어별 개발자 분류하기(GROUP BY) (0) | 2026.04.20 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 연도별 대장균 크기의 편차 구하기(MAX) (0) | 2026.04.19 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 물고기 종류 별 대어 찾기(MAX) (1) | 2026.04.19 |