IT Study/Database
GROUP BY
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
원하는 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