📌 문제 정보
- 문제 이름 : 프로그래머스 - (GROUP BY) 조건에 맞는 사원 정보 조회하기
- 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/284527
📌 문제 요약
- HR_DEPARTMENT 테이블 : DEPT_ID(부서 ID), DEPT_NAME_KR(국문 부서명), DEPT_NAME_EN(영문 부서명), LOCATION(부서 위치)
- HR_EMPLOYEES 테이블 : EMP_NO(사번), EMP_NAME(사원 성명), DEPT_TO(부서 ID), POSITION(직책), EMAIL, COMP_TEL(전화번호), HIRE_DATE(입사일), SAL(연봉)
- HR_GRADE 테이블 : EMP_NO(사번), YEAR, HALF_YEAR(반기), SCORE(평가 점수)
- HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블에서 2022년도 한해 평가 점수가 가장 높은 사원 정보를 조회하려 합니다. 2022년도 평가 점수가 가장 높은 사원들의 점수, 사번, 성명, 직책, 이메일을 조회하는 SQL문을 작성. 2022년도의 평가 점수는 상,하반기 점수의 합을 의미하고, 평가 점수를 나타내는 컬럼의 이름은 SCORE.
예시)
| DEPT_ID | DEPT_NAME_KR | DEPT_NAME_EN | LOCATION |
| D0001 | 법무팀 | Law Dep | 그렙타워 4층 |
| D0002 | 인사팀 | Human resources | 그렙타워 4층 |
| D0003 | 총무팀 | General Affairs | 그렙타워 4층 |
| EMP_NO | EMP_NAME | DEPT_ID | POSITION | COMP_TEL | HIRE_DATE | SAL | |
| 2017002 | 정호식 | D0001 | 팀장 | hosick_jung@grepp.com | 031-8000-1101 | 2017-03-01 | 65,000,000 |
| 2018001 | 김민석 | D0001 | 팀원 | minseock_kim@grepp.com | 031-8000-1102 | 2018-03-01 | 60,000,000 |
| 2019001 | 김솜이 | D0002 | 팀장 | somi_kim@grepp.com | 031-8000-1106 | 2019-03-01 | 60,000,000 |
| 2020002 | 김연주 | D0002 | 팀원 | yeonjoo_kim@grepp.com | 031-8000-1107 | 2020-03-01 | 53,000,000 |
| 2020005 | 양성태 | D0003 | 팀원 | sungtae_yang@grepp.com | 031-8000-1112 | 2020-03-01 | 53,000,000 |
| 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 |
출력)
| SCORE | EMP_NO | EMP_NAME | POSITION | |
| 181 | 2020002 | 김연주 | 팀원 | yeonjoo_kim@grepp.com |
📌 내 풀이 및 코드
SELECT
SUM(hg.SCORE) AS SCORE, -- 각 사원의 2022년도 상/하반기 점수를 합산하여 SCORE로 표시
he.EMP_NO, -- 사번
he.EMP_NAME, -- 사원 이름
he.POSITION, -- 직책
he.EMAIL -- 이메일
FROM HR_EMPLOYEES he -- HR_EMPLOYEES 테이블을 he로 별칭 지정
JOIN HR_GRADE hg ON he.EMP_NO = hg.EMP_NO -- 평가 테이블 HR_GRADE와 사번 기준으로 JOIN
WHERE hg.YEAR = "2022" -- 2022년도 평가만 대상으로 필터링
GROUP BY he.EMP_NO -- 사번별로 그룹핑 (사람마다 합산 점수를 구하기 위해)
ORDER BY SCORE DESC -- 점수 높은 순으로 정렬
LIMIT 1; -- 가장 높은 사람 1명만 출력
- 테이블이 3개이길래 3개를 다 조회해야하는줄 알고 3개 조인을 어떻게 하는지 몰라서 고민했었던 것 같음.
- 점수가 가장 높은 사람 1명 출력이라길래 MAX()를 쓰려고 했는데 MAX를 써버리면 가장 높은 합계 점수만 알려주기 때문에 그 점수를 받은 사원이 누구인지 정보를 알 수 없음. 문제에서 누가 최고 점수인지 함께 출력하라고 해서 MAX를 쓰면 모호해짐.
📌 새로 배운 문법
<-- 이번 문제에서 새로 배운 Java 문법 정리 -->
- 테이블의 이름이 너무 길 때, 뒤에 특정 명칭을 써주면 축약해서 조인할 수 있다!
'CODING TEST > MySQL' 카테고리의 다른 글
| Lv2 - 분기별 분화된 대장균의 개체 수 구하기 (0) | 2025.08.01 |
|---|---|
| Lv2 - 노션별 평균 역 사이 거리 조회하기 (0) | 2025.08.01 |
| Lv2 - 조건에 맞는 개발자 찾기 (0) | 2025.07.30 |
| Lv2 - 업그레이드 된 아이템 구하기 (0) | 2025.07.30 |
| Lv2 - 자동차 평균 대여 기간 구하기 (0) | 2025.07.29 |
