본문 바로가기

Oracle/Oracle Programming

[Oracle] GROUP BY 절

반응형

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;



반응형