■ GROUP BY 절
-. GROUP BY 절은 최대 값이나, 최소 값, 합계, 평균 등을 어떤 컬럼을 기준으로 그 컬럼의 값별로 보고자 하는 경우 사용한다.
-. 그룹함수를 쓰되 어떤 컬럼 값을 기준으로 그룹 함수를 적용해 줄지 기술해 주어야 하는데
GROUP BY절 뒤에 해당 컬럼을 기술하면 된다.
SELECT 컬럼명 별칭, FROM 테이블명 WHERE 조건(연산자) GROUP BY 컬럼명; |
-. GROUP BY 절을 사용할 때 주의할 점은 GROUP BY절 다음에는 컬럼의 별칭을 사용할 수 없고,
반드시 컬럼명을 기술해야 한다는 점이다.
-. 사원 테이블에서 부서별로 평균 급여를 구하려면 우선 전체 사원을 부서별로 그룹핑을 해야 한다.
① 소속 부서별 평균 급여를 구하는 예제
SQL> SELECT AVG(sal) FROM emp GROUP BY deptno; |
직원 전체의 평균값이 아닌 각각의 부서별 평균을 구하는데 현재 직원들이 속한 부서는 10, 20, 30번 부서 단 세곳이므로
각각 10번, 20번, 30번 부서별 평균이 산출된다. 그러나 각 평균급여는 어느 부서의 평균값인지의 정보가 결여되어 의미 있는 정보라 할 수 없다.
어떤 부서의 평균인지를 알기 위해 아래와 같이 부서 번호인 deptno도 SELECT상에 함께 기술한다.
② 소속 부서별 평균 급여를 구하는 예제
SQL> SELECT deptno, AVG(sal) FROM emp GROUP BY deptno; |
풀이)
본래는 그룹함수 사용시, 그룹함수를 적용하지 않은 단순 컬럼은 함께 SELECT 리스트에 사용할 수 없다고 하였다. 이유는 개수 문제로 매치가 불가능 하기 때문이다. 그런데 이 쿼리문을 실행시키면 에러가 나지 않고 원하는 결과가 제대로 나온다. 이유는 GROUP BY를 사용하는 경우는 두 개의 매치가 가능하기 때문이다. |
③ 10번 부서와 10번의 평균, 20번 부서와 20번의 평균, 30번 부서와 30번의 평균을 매치시켜 값을 산출하는 예제
SQL> SELECT deptno, sal FROM emp ORDER BY deptno; |
-. 그룹함수 사용시 단순 컬럼은 SELECT 리스트에 올 수 없다.
-. 단 GROUP BY 절 뒤에 묶인 단순 컬럼은 SELECT 리스트에 기술할 수 있고, 기술해야만 정보로써 의미가 있다.
④ GROUP BY절에 명시하지 않은 컬럼을 SELECT 절에 사용한 잘못된 예제
SQL> SELECT deptno, ename, AVG(sal) FROM emp GROUP BY deptno; |
에러) ORA-00979: GROUP BY 표현식이 아닙니다. 00979. 00000 - "not a GROUP BY expression" 풀이) 그룹함수 사용시 GROUP BY 절로 묶이지 않은 단순 컬럼은 SELECT 리스트에 사용 불가능 하고 사용시 에러가 산출된다. |
⑤ 부서별로 전체 사원인원수와 커미션을 받는 사원들의 수를 계산하는 예제
SQL> SELECT deptno, COUNT(*), COUNT(comm) FROM emp GROUP BY deptno; |
⑥ 부서별 최대 급여와 최소 급여를 산출하기 위한 예제
SQL> SELECT deptno, MAX(sal), MIN(sal) FROM emp GROUP BY deptno; |
'Oracle > Oracle Programming' 카테고리의 다른 글
[Oracle] 조인의 기본 개념 (0) | 2012.11.27 |
---|---|
[Oracle] HAVING 절 (1) | 2012.11.25 |
[Oracle] 그룹함수 (0) | 2012.11.25 |
[Oracle] 중복되는 컬럼을 한 번씩만 보여주기 위한 DISTINCT 키워드 (0) | 2012.11.06 |
[Oracle] Concatenation 연산자의 정의와 사용 (0) | 2012.11.06 |