추가
SQL 전문가 가이드에 HAVING절 내용이 있네요.
----------------------------------------------------------------------------------------------------
만일 위의 쿼리에서 GROUP BY 와 HAVING 절의 순서를 바꾼다면?
GROUP BY 절과 HAVING 절의 순서를 바꾸어서 수행하더라도 문법 에러도 없고 결과물도 동일한 결과를 출력한다.
그렇지만, SQL 내용을 보면, 포지션이란 소그룹으로 그룹핑(GROUPING)되어 통계 정보가 만들어지고, 이후 적용된 결과 값에 대한 HAVING 절의 제한 조건에 맞는 데이터만을 출력하는 것이므로 논리적으로 GROUP BY 절과 HAVING 절의 순서를 지키는 것을 권고한다.
(단 SQL SERVER는 반드시 GROUP BY 와 HAVING 절의 순서를 지켜야 한다)
----------------------------------------------------------------------------------------------------
http://wiki.gurubee.net/pages/viewpage.action?pageId=26743892
1. 다음 GROUP BY 집계쿼리의 의미를 설명하세요.
사원 테이블에 사원이 3명 초과된 부서의 부서별 급여를 내림순으로 정렬.
2. 쿼리의 문제점을 설명하고 문제를 해결해 보세요.
그룹함수 중첩발생
ORDER BY절의 'SUM(급여) DESC'는 SELECT절의 'SUM(급여) 급여'의 결과값을
한번 더 합산하므로 그룹함수 중첩 에러 발생.
ORDER BY절은 SELECT절 이후 실행되므로 ORDER BY 절은 Alias 사용
SELECT 부서, SUM(급여) 급여 FROM 사원 HAVING COUNT(*) > 3 GROUP BY 부서 ORDER BY 급여 DESC
출제의도
- SELECT 쿼리의 실행순서 확인목적.
- 쿼리상의 GROUP BY절과 HAVING절 순서는 변경되어도 결과에 상관없다.
[정답]
1. 쿼리 설명
- 사원 테이블에서 부서별로 집계하여 사원수가 3명 초과하는 부서에 대해
- 부서와 급여합계를 급여합계가 많은 순으로 출력하는 쿼리입니다.
2. 쿼리의 문제점
- SELECT 절의 "SUM(급여)" 에서의 "급여"와
- ORDER BY 절의 "SUM(급여)" 에서의 "급여"가 다름을 알아야 하는 문제입니다.
- SELECT 절의 "SUM(급여)" 에서의 "급여"는 사원 테이블의 급여 컬럼을 의미하고
- ORDER BY 절의 "SUM(급여)" 에서의 "급여"는 SELECT 절의 SUM(급여) 에 대한 알리아스를 의미합니다.
- 따라서 ORDER BY SUM(급여) 를 풀어 쓰면 ORDER BY SUM(SUM(급여)) 가 됩니다.
- 집계 함수를 중첩해서 사용하여 에러 발생
3. 해경방안
- 따라서 오류가 발생하지 않도록 고치는 여러가지 방법
- ORDER BY SUM(급여) DESC ===> ORDER BY 급여 DESC -- 알리아스 사용
- ORDER BY SUM(급여) DESC ===> ORDER BY SUM(사원.급여) DESC -- 테이블명을 명시하여 컬럼명 사용
- SELECT SUM(급여) 급여 ===> SELECT SUM(급여) 급여합계 -- 알리아스를 다르게 주어 혼동 예방
4. 핵심정리
- GROUP BY 집계쿼리의 기초를 이해하고 있는지?
- SELECT 문장의 구문 해석 순서를 이해하고 있는지?
- 이 두가지 사항을 혼합하여 만든 문제입니다.
- 컬럼 가공 별칭을 컬럼명과 동일하게 주는 경우
- Order By 절에서 해당 명칭을 사용함에 있어 주의를 기울여야 합니다.
- GROUP BY 와 HAVING 절은 순서가 바뀌어도 됩니다.