[퀴즈] GROUP BY 기초 문제 1 5 17,538

by 마농 GROUP BY [2018.08.30 11:33:57]


[퀴즈] GROUP BY 기초 문제

1. 다음 GROUP BY 집계쿼리의 의미를 설명하세요.
2. 쿼리의 문제점을 설명하고 문제를 해결해 보세요.

SELECT 부서
     , SUM(급여) 급여
  FROM 사원
HAVING COUNT(*) > 3
 GROUP BY 부서
 ORDER BY SUM(급여) DESC
;

 

by 우리집아찌 [2018.08.30 12:25:15]

1. HAVING 절이 왜 GROUP 위에 있어도 실행되는지 모르겠네요... ㅜㅜ ( 뭔가 있는것 같은데.. 잘.. )

   뭐 일단

   부서별 급여합의 집계에서 부서당 3건이 넘는 것들만 보여준다 정렬은 급여합 역순이다.

2. ORDER BY 절에서는 컬럼은 SELECT 절에 존재햐야한다 사용되야한다. 위에서는 SUM(급여) 에 "급여"가 ALIAS 되어있음 

   ORDER BY SUM(급여) DESC => ORDER BY SAL DESC

   아니면 SELECT 부서, SUM(급여) ... ORDER BY SUM(급여) DESC


by 우리집아찌 [2018.08.31 10:00:45]

추가 

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


by 잠만보 [2018.08.30 17:40:15]

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절 순서는 변경되어도 결과에 상관없다.


by 마농 [2018.08.31 15:13:40]

[정답]

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 절은 순서가 바뀌어도 됩니다.


by 비상하는토끼 [2021.08.04 17:34:59]

좋은 정보 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입