본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기(GROUP BY)

by gwon_s 2026. 4. 20.

👇 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

🔓 문제 설명

HR_DEPARTMENTHR_EMPLOYEESHR_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 EMAIL 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만 건으로 압축한 뒤 조인합니다.