취뽀 기록

#열심히 살자 #취업 #공부

SQL/[프로그래머스]

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

hyunnn_00 2024. 4. 2. 13:41

https://school.programmers.co.kr/learn/courses/30/lessons/284528

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나의 풀이

1. 문제에 쓰여있지는 않지만, HR_GRADE 테이블의 HALF_YEAR 열의 1과 2의 평균을 내어 점수 계산해야 함.

2. CASE WHEN 구문을 이용하여 GRADE 컬럼과 BONUS 컬럼 생성

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

ORDER BY EMP.EMP_NO

 

풀이2

1. AVG_SCORE의 임시테이블 T1 만들기

    ㄴ EMP_NO별로 GROUP BY 하여 SCORE의 평균 구하기

2. HR_EMPLOYEES 테이블과 T1 테이블을 조인하고, AVG_SCORE 별로 CASE WHEN 구문 조건 걸어서 GRADE 컬럼과 BONUS 컬럼 만들기

WITH T1 AS (
    SELECT EMP_NO, AVG(SCORE) AS AVG_SCORE
    FROM HR_GRADE
    GROUP BY EMP_NO
) 

SELECT T1.EMP_NO, 
       EMP_NAME, 
  CASE WHEN T1.AVG_SCORE >= 96 THEN 'S'
       WHEN T1.AVG_SCORE >= 90 THEN 'A'
       WHEN T1.AVG_SCORE >= 80 THEN 'B'
       ELSE 'C' END AS 'GRADE',
  CASE WHEN T1.AVG_SCORE >= 96 THEN SAL*0.2
       WHEN T1.AVG_SCORE >= 90 THEN SAL*0.15
       WHEN T1.AVG_SCORE >= 80 THEN SAL*0.1
       ELSE 0 END AS 'BONUS'
     
FROM HR_EMPLOYEES
    LEFT JOIN T1 ON HR_EMPLOYEES.EMP_NO = T1.EMP_NO