우당탕탕 개발일지

[SQL] 프로그래머스 GROUP BY : 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (level 4) 본문

SQL

[SQL] 프로그래머스 GROUP BY : 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (level 4)

민아당긴아 2025. 1. 11. 23:41

💡문제 링크

 

프로그래머스

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

programmers.co.kr

 

 

💡SQL 코드 설계

HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블을 이용해 사원별 성과금 정보를 조회하려합니다. 평가 점수별 등급과 등급에 따른 성과금 정보가 아래와 같을 때, 사번, 성명, 평가 등급, 성과금을 조회하는 SQL문을 작성해주세요. 평가등급의 컬럼명은 GRADE로, 성과금의 컬럼명은 BONUS로 해주세요. 결과는 사번 기준으로 오름차순 정렬해주세요.

1. HR_GRADE 테이블의 SCORE의 값에 따라 GRADE가 나뉘기 때문에, SELECT절에 CASE WHEN 함수를 사용해서 GRADE열을 만든다.

2. HR_GRADE 테이블의 SCORE의 값에 따라 BONUS로 줄 돈의 %가 나뉘기 때문에, SELECT절에 CASE WHEN 함수를 사용해서 BONUS열을 만든다.

3. 상반기, 하반기의 평균 점수를 바탕으로 GRADE를 결정하기 때문에 평균 점수를 나타내는 테이블을 새로 만들어야 한다.

 

💡SQL 코드

SELECT E.EMP_NO, E.EMP_NAME, 
    CASE 
        WHEN G.SCORE >= 96 THEN "S"
        WHEN G.SCORE >= 90 THEN "A"
        WHEN G.SCORE >= 80 THEN "B"
        ELSE "C"
    END AS GRADE,
    CASE 
        WHEN G.SCORE >= 96 THEN E.SAL * 0.2
        WHEN G.SCORE >= 90 THEN E.SAL * 0.15
        WHEN G.SCORE >= 80 THEN E.SAL * 0.1
        ELSE 0
    END AS BONUS
FROM HR_EMPLOYEES AS E
JOIN (
    SELECT EMP_NO, AVG(SCORE) AS SCORE
    FROM HR_GRADE
    GROUP BY EMP_NO
) AS G
ON E.EMP_NO = G.EMP_NO

# SELECT C.CAR_ID, C.CAR_TYPE, ROUND(30*C.DAILY_FEE*(100-P.DISCOUNT_RATE)*0.01) AS FEE
# FROM CAR_RENTAL_COMPANY_CAR AS C
# JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
# ON C.CAR_ID = H.CAR_ID
# JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
# ON C.CAR_TYPE = P.CAR_TYPE
# WHERE C.CAR_ID NOT IN (
#     select car_id 
#     from car_rental_company_rental_history
#     where start_date <= '2022-11-30' and end_date > '2022-11-01'
# ) AND P.DURATION_TYPE = '30일 이상'
# GROUP BY C.CAR_ID
# HAVING C.CAR_TYPE IN ('세단', 'SUV') AND (FEE >= 500000 AND FEE <= 2000000)
# ORDER BY FEE DESC, C.CAR_TYPE, C.CAR_ID DESC

💡기억할 내용

1. GRADE 열을 CASE WHEN으로 만든 다음에 이후 CASE WHEN문에서 GRADE를 바로 쓸 수 없다. 초반에 아래처럼 써서 실패했다.

SELECT E.EMP_NO, E.EMP_NAME, 
    CASE 
        WHEN G.SCORE >= 96 THEN "S"
        WHEN G.SCORE >= 90 THEN "A"
        WHEN G.SCORE >= 80 THEN "B"
        ELSE "C"
    END AS GRADE,
    CASE 
        WHEN GRADE = "S" THEN E.SAL * 0.2
        WHEN GRADE = "A" THEN E.SAL * 0.15
        WHEN GRADE = "B" THEN E.SAL * 0.1
        ELSE 0
    END AS BONUS