몸과 마음이 건전한 SW 개발자

[SQL-GROUP BY] 프로그래머스 Lv. 2 조건에 맞는 사원 정보 조회하기 [다시 풀어 보기] 본문

SQL/다시 풀어 보기

[SQL-GROUP BY] 프로그래머스 Lv. 2 조건에 맞는 사원 정보 조회하기 [다시 풀어 보기]

스위태니 2024. 12. 19. 20:13

문제 링크

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

 

프로그래머스

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

programmers.co.kr

정답 코드

WITH TOTAL_SCORES AS (
    SELECT 
        G.EMP_NO,
        SUM(G.SCORE) AS SCORE
    FROM HR_GRADE G
    WHERE G.YEAR = 2022
    GROUP BY G.EMP_NO
),
MAX_SCORE AS (
    SELECT 
        MAX(SCORE) AS MAX_SCORE
    FROM TOTAL_SCORES
)
SELECT 
    TS.SCORE,
    E.EMP_NO,
    E.EMP_NAME,
    E.POSITION,
    E.EMAIL
FROM TOTAL_SCORES TS
JOIN HR_EMPLOYEES E
ON TS.EMP_NO = E.EMP_NO
JOIN MAX_SCORE MS
ON TS.SCORE = MS.MAX_SCORE
ORDER BY E.EMP_NO;

풀이 과정

  1. WITH TOTAL_SCORES
    • 각 사원의 2022년도 평가 점수 총합을 계산한다.
      • SUM(G.SCORE)를 사용하여 상반기와 하반기의 점수를 합산한다.
      • 연도는 WHERE G.YEAR = 2022로 필터링하여 2022년 데이터만 계산한다.
      • 각 사원별로 점수를 그룹화하기 위해 GROUP BY G.EMP_NO를 사용한다.
  2. WITH MAX_SCORE
    • 모든 사원의 총합 점수 중 가장 높은 점수를 계산한다.
      • MAX(SCORE)를 사용하여 TOTAL_SCORES에서 최고 점수를 가져온다.
  3. 최종 SELECT
    • 평가 점수가 가장 높은 사원의 정보를 조회한다.
      • TOTAL_SCORES와 HR_EMPLOYEES를 조인(JOIN)하여 사원의 세부 정보를 가져온다.
      • ON TS.EMP_NO = E.EMP_NO를 통해 사번(EMP_NO)을 기준으로 연결한다.
      • TOTAL_SCORES.SCORE와 MAX_SCORE.MAX_SCORE를 비교하여 최고 점수를 받은 사원을 필터링한다.
      • 결과는 사번(EMP_NO)을 기준으로 오름차순 정렬한다.

느낀점

  • 사실 with문이 뭔지 모르기 때문에 그거에 대해서 다시 알아보면 좋을 것 같다.

WITH 문 기본 구조

WITH cte_name AS (
    SELECT column1, column2
    FROM table_name
    WHERE conditions
)
SELECT *
FROM cte_name;

 

  1. WITH cte_name AS (...)
    • cte_name은 CTE의 이름이다.
    • 괄호 안의 쿼리가 실행되어 cte_name이라는 임시 테이블로 저장된다.
  2. SELECT ... FROM cte_name
    • 정의한 cte_name을 메인 쿼리에서 사용하는 방식이다.

WITH 문 사용의 장점

 

  1. 복잡한 쿼리를 단순화
    • 긴 쿼리를 여러 단계로 나누어 작성할 수 있어 가독성이 높아진다.
    • 중첩 서브쿼리를 사용하지 않아도 되어 쿼리 유지보수가 편리하다.
  2. 코드 재사용
    • 동일한 계산이나 조건을 반복적으로 사용할 때 효율적이다.
    • 동일한 데이터를 여러 곳에서 참조할 수 있다.
  3. 임시 테이블 대체
    • 테이블을 따로 생성하지 않고, 메모리에서 임시로 데이터를 처리한다.