[Programmers/mysql] 284529: 부서별 평균 연봉 조회하기 (+ 그룹화의 기준이 아니고, 집계함수가 쓰이지 않는 컬럼 선택)

songeunm·2024년 9월 9일

PS - sql

목록 보기
10/58
post-thumbnail

문제

Lv. 3 / GROUP BY

문제 흐름

레벨에 비해 정답률이 높아보이는 문제였는데 역시 간단했다!
각 직원들의 데이터에 부서의 데이터를 LEFT JOIN 해서 연결시킨 후 GROUP BY를 통해 부서별 평균 연봉을 계산해주면 되겠다.

정리하면서 생각해보니 이런 생각이 들었다.

GROUP BY의 기준이 되지도 않고 집계함수가 쓰이지도 않는 컬럼인 DEPT_NAME_EN이 있는데 어떻게 정상적으로 작동하고 성공한거지?

근데 LEFT JOIN을 하면서 하나의 행마다DEPT_NAME_EN가 하나씩 지정되기때문에 그런게 아닐까 싶다.
그런 의미에서 HR_DEPARTMENT에 있는 다른 컬럼들도 DEPT_NAME_EN처럼 들어올 수 있다.
그리고 HR_EMPLOYEES의 컬럼은 들어올 수 없었다. (에러 발생함)

아무래도 계속 원인이 궁금했다.

  1. 일단 내가 이전에 그룹화의 기준이 아니고 집계함수가 쓰이지 않는 컬럼을 넣었을 때 해당 컬럼의 임의의 값을 반환하는 것을 확인한 적이 있다.
    내 정답 코드에서는 왜 갑자기 정상 작동하고, 왜 HR_EMPLOYEES의 컬럼들은 랜덤 값을 출력하지 않고 에러가 발생하는가?
  2. 내 생각처럼 그룹화 후 행마다 하나의 컬럼값이 결정되기 때문에 정상작동한게 맞을까?

질문이 세부적이기도 하고 제목에서도 알 수 있듯이 (그룹화의 기준이 아니고, 집계함수가 쓰이지 않는 컬럼 선택) 너무 주절주절 길어져서 서치에 어려움이 있을 것 같아서 GPT를 이용했다!

여러 질문을 하고 답변을 받았는데 중요 내용을 요약해보자면 이렇다.

  1. ONLY_FULL_GROUP_BY모드가 활성화되었기 때문인 것으로 보인다.
    이전에는 아마 활성화되지 않은 환경에서 쿼리를 돌렸던 것 같다.

  2. 내 생각이 맞았다.
    쿼리문에서 그룹화 기준별로 유니크한 값을 가진다면 집계함수를 사용하지 않아도 의도대로 값을 반환한다.

코드

/*
부서별 평균 연봉 조회하기
GROUP BY
*/

SELECT DEPT_ID, DEPT_NAME_EN, ROUND(AVG(SAL), 0) as AVG_SAL
FROM HR_EMPLOYEES LEFT JOIN HR_DEPARTMENT
USING (DEPT_ID)
GROUP BY 1
ORDER BY 3 DESC;

마무리

풀면서도 쉬운데? 왜 레벨 3이 이렇게 쉽지? 했는데 보다보니 의문점이 생겼다.
사소한 부분이긴 하지만 새로운 정보를 얻어갈 수 있어서 소득이 있는 문제였다.

profile
데굴데굴 구르는 개발자 지망생

0개의 댓글