본문 바로가기
Today I Learned/SQL

[SQL] 조건에 맞는 사원 정보 조회하기

by YES_developNewbie 2024. 8. 13.

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;