IT 프로그래밍/ORACLE2014. 1. 26. 21:40

이번에는 오라클 group by 절에 대해서 알아보겠습니다.

 

글 읽기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

 

 

 

어떤 컬럼 값을 기준으로 그룹함수를 적용해 줄지 기술해 주어야 할 경우에는 select 문에 group by 절을 추가하되 group by 절 뒤에 해당 컬럼을 기술합니다.

 

그룹 함수는 테이블에 아무리 행이 많아도 단 한 개의 결과값만을 산출합니다. 그러나 직원 중 가장 높은 급여값을 구하는 것이 아닌, 부서별 가장 높은 급여값을 구하고 싶을 때가 있습니다. 즉, 최대값이나 최소값, 합계, 평균 등을 어떤 컬럼을 기준으로 보고자 하는 경우입니다.

 

이때는 그룹 함수를 쓰되 어떤 컬럼값을 기준으로 그룹 함수를 적용할지 기술해야 합니다.

 

group by 절 뒤에 해당 컬럼을 기술하면 됩니다. 형식은 다음과 같습니다.

 

[형식]

select 컬럼명, 그룹 함수

from 테이블명

where 조건(연산자)

group by 컬럼명;

 

합계, 평균, 최대값이나 최소값 등을 어떤 컬럼을 기준으로 그 컬럼의 값을 개별적으로 보고자 할 때 group by 절 뒤에 해당 컬럼을 기술하면 됩니다. group by절을 사용할 때 주의할 점은 group by절 다음에는 컬럼의 별칭은 사용할 수 없고, 반드시 기존에 있는 컬럼명을 기술해야 한다는 점입니다.

 

사원 테이블을 부서 번호로 그룹 지어 보겠습니다.

 

select deptno from emp group by deptno;

 

 

 

사원 테이블을 부서 번호로 그룹 짓기 위해서 group by절 다음에 부서 번호(deptno)를 기술하였습니다. 위 결과를 보면 사원들은 3개(10번, 20번, 30번) 중의 하나에 소속되어 있는 것을 알 수 있습니다.

 

사원 테이블에서 부서별로 평균 급여를 구하려면 우선 전체 사원을 소속 부서별로 그룹 지어 놓아야 합니다.

 

다음은 소속 부서별 평균 급여를 구하는 예제입니다.

 

select avg(sal) from emp group by deptno;

 

 

 

 

현재 직원들이 속한 부서는 10, 20, 30번부서 단 세 곳이므로 각각 10번, 20번, 30번 부서별 평균이 산출됩니다. 이대로 실행하면 의미 있는 정보가 산출이 될까요? 위의 결과값은 분명 3개 부서의 평균값, 3개의 로우가 산출됩니다. 하지만 각 평균 급여는 어느 부서의 평균값인지의 정보가 결여되어 있어 의미 있는 정보라고 하기는 어렵습니다.

 

어떤 부서의 평균인지를 알아보기 위해 아래와 같이 부서 번호인 deptno도 select절에 함께 기술합니다.

 

select deptno, avg(sal) from emp group by deptno;

 

 

 

 

그룹 함수를 적용하지 않은 단순 컬럼은 select 리스트에 함께 사용할 수 없습니다. 이유는 개수 문제로 매치가 불가능하기 때문입니다.

 

쉽게 예제로 설명을 드리겠습니다.

 

select deptno, ename, avg(sal) from emp group by deptno;

 

 

 

오류가 발생하게 됩니다.

 

그 이유는 deptno, ename, avg(sal)의 컬럼의 산출값이 틀리기 때문입니다.

 

그룹함수 사용 시 group by 절로 묶이지 않은 단순 컬럼은 select 리스트에 사용할 수 없고, 사용시 에러가 발생하므로 주의를 하셔야 합니다.

 

쉽게 설명을 한다고 적었는데 이해가 되셨는가요?

 

궁금하신점은 댓글에 남겨주세요~^^

 

 

Posted by 정윤문경아빠