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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

INNER JOIN + GROUP BY + ONLY FULL GROUP BY MODE  를 활용합니다.

 

문제에서 흥미로웠던 점은,ONLY FULL GROUP BY MODE  입니다.

이 말은, NON-AGGREGATE 컬럼(비집계데이터)는 GROUP BY 절에 해당 컬럼이 포함되어 있어야 함을 의미합니다.

저는, 그러한 이유에서 GROUP BY HD.DEPT_ID, HD.DEPT_NAME_EN 을 통해 HD.DEPT_NAME_EN 도 함꼐 GROUP BY 했습니다.

하지만, 문제를 풀면서 의문이 생겼고, GROUP BY HD.DEPT_ID 로도 작동하는지 테스트했습니다.

 

결론은 이 문제에서는 가능합니다.

 

불확실하지만, 저의 생각에 이 문제의 경우 가능한 이유는, GROUP BY 의 기준이 HD 테이블이기 때문입니다.

HD 테이블을 기준으로 HE 테이블을 집계하는 것 이므로 HD 테이블에 존재하는 데이터는 사용가능합니다.

 

하지만, 모든 DB에서의 문제성을 피하기 위해서 GROUP BY HD.DEPT_ID, HD.DEPT_NAME_EN 로 사용하는것이 좋아보입니다. (만약, HD.DEPT_NAME 별로 나누라고 한다면?? 이라는 케이스가 나온다면 이야기가 달라집니다.)

해당 부분에 대해서는 이후에 비슷한 문제가 나온다면 더 적용해볼 필요가 있어보입니다.

코드

SELECT HE.DEPT_ID, HD.DEPT_NAME_EN, ROUND(AVG(HE.SAL), 0) AS AVG_SAL
FROM HR_DEPARTMENT AS HD
INNER JOIN HR_EMPLOYEES AS HE
ON HD.DEPT_ID = HE.DEPT_ID
GROUP BY HD.DEPT_ID, HD.DEPT_NAME_EN
# GROUP BY HD.DEPT_ID -- 이 group by 로 해도 작동합니다.
ORDER BY AVG_SAL DESC

+ Recent posts