문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/284527
SELECT SUM(HG.SCORE) AS SCORE, HE.EMP_NO, HE.EMP_NAME, HE.POSITION, HE.EMAIL
FROM HR_DEPARTMENT HD
JOIN HR_EMPLOYEES HE ON HD.DEPT_ID = HE.DEPT_ID
JOIN HR_GRADE HG ON HE.EMP_NO = HG.EMP_NO
WHERE HG.YEAR = 2022
GROUP BY HE.EMP_NO, HE.EMP_NAME, HE.POSITION, HE.EMAIL
ORDER BY SCORE DESC
LIMIT 1;
- 2022년도의 상·하반기 점수를 합산
- 합산한 점수 기준으로 내림차순 정렬 후 가장 높은 점수를 가진 사원 정보를 반환
관련 메모
MySQL에서는 GROUP BY절에 포함된 열 이외에
SELECT에 있는 모든 열도 GROUP BY에 포함하거나, 집계 함수를 통해 사용해야 한다.
그렇지 않으면 MySQL은 어떤 값을 반환해야 할지 모호하다고 판단한다.
ex ) GROUP BY 규칙 이유
GROUP BY HE.EMP_NO로만 그룹화하고
HE.EMP_NAME, HE.POSITION, HE.EMAIL을 SELECT 절에 그대로 쓰면
각 EMP_NO에 대해 어떤 EMP_NAME, POSITION, EMAIL 값을 반환할지 명확하지 않다.
예를 들어, 하나의 사원이 여러 부서에 속할 경우 각기 다른 사원 정보가 있을 수 있기 때문이다.
이를 해결하기 위해 GROUP BY 절에 이 필드를 모두 포함해 사원의 모든 정보가 고유하게 결정되도록 설정하거나
MAX(), MIN()과 같은 집계 함수를 사용해 각 사원의 한 가지 값을 명확히 선택하는 방법을 사용한다.
결론 : 이 문제의 쿼리에서 사원 정보가 고유하게 결정되도록 GROUP BY에 EMP_NAME, POSITION, EMAIL 컬럼을 추가해주는 것이 정확하다.
320x100
'PRACTICE > SQL' 카테고리의 다른 글
[MySQL] 2단계 35. 연도별 대장균 크기의 편차 구하기 (0) | 2025.01.05 |
---|---|
[MySQL] 2단계 34. 조건에 맞는 개발자 찾기 (0) | 2025.01.04 |
[MySQL] 2단계 32. 업그레이드 된 아이템 구하기 (0) | 2025.01.03 |
[MySQL] 2단계 31. 분기별 분화된 대장균의 개체 수 구하기 (0) | 2025.01.02 |
[MySQL] 2단계 30. 노선별 평균 역 사이 거리 조회하기 (0) | 2025.01.02 |