Tilo 2008. 7. 22. 18:02
GROUP BY

원하는 column으로 group화 할 수 있다.

SELECT title, avg(salary), max(salary), min(salary)
FROM s_emp
GROUP BY title;

해설 : 직무별로 급여의 최대, 최소, 평균값을 구한다.

SELECT region_id, country, count(*)
FROM s_customer
GROUP BY region_id, country;

해설 : s_customer table에서 region_id별로 나눈 다음 다시 country별로 나누어서 그 갯수를 구한다.

SELECT dept_id, count(*) "Number"
FROM s_emp
WHERE title='Stock Clert'
GROUP BY dept_id;

해설 : s_emp table에서 title이 'Stock Clert'인 사원들을 dept_id로 나눈 다음 그 갯수를 구한다.(Stock Clerk 직종의 사원들의 부서별 인원수를 출력한다.)
결과로 나오는 인원수의 cloumn title은 "Number"로 표시된다.

SELECT title, max(salary)
FROM s_emp
GROUP BY title
ORDER BY max(salary) DESC;


해설 : title별 최고 급여(salary)를 급여가 많은 직종부터 출력한다.

* GROUP BY절의 실행순서
  3 SELECT
  1 FROM
  2 GROUP BY
  4 ORDER BY

query의 실행 순서가 위와 같으니 GROUP BY절에 positional notation과 column alias를 사용할 수 없다. (FROM절은 1번째로 실행되므로 FROM절에서 table alias는 사용할 수 있다.)

SELECT region_id, country, count(*)
FROM s_customer
GROUP BY 1, 2;

이 query는 error가 발생한다.
GROUP BY절을 보면 SELECT절에 명시한 region_id, country로 group화 하려는 의도로 1, 2이렇게 positional notation을 사용한것을 볼 수 있다.
하지만 GROUP BY절은 2번째로 실행이 되고, 이 때 SELECT문은 아직 실행이 되지 않았기 때문에 1번째 column이 무엇인지, 2번째 column이 무엇인지 알 수 없다.
따라서 error가 발생하게 된다.

SQL> select region_id, country, count(*)
  2  from s_customer
  3  group by 1, 2
  4  ;
select region_id, country, count(*)
       *
1행에 오류:
ORA-00979: GROUP BY 의 식이 없습니다

* GROUP BY절의 실행순서(WHERE절 있을 때)
  4 SELECT deptno, job, SUM(sal) sumsal
  1 FROM emp
  2 WHERE SUM(sal)<2500
  3 GROUP BY deptno, job;

해설 : 의도는 부서번호와 직업으로 분류를 해서 그 중 급여의 합이 2500보다 작은 값들을 출력하려는 의도인데 이 결과는 error발생이다.
이를 알기 위해서 query문의 실행순서를 보면 위의 빨간색 번호와 같다.
따라서 SUM(sal)은 GROUP BY한 결과인데, WHERE절은 GROUP BY가 실행되기 이전에 실행되서 이 순간에 알 수 없게 되기 때문에 error가 발생한다.


출처 : http://shoutrock.egloos.com/4083180