본문 바로가기

Oracle/Oracle Programming

[Oracle] 그룹함수

반응형

■ 그룹 함수


01. 합을 구하는 SUM 함수

 -. SUM 함수는 해당 컬럼 값들에 총합을 구하는 함수이다.

급여 총액을 구하는 예제

SQL> SELECT SUM(sal)

         FROM emp;



02. 평균을 구하는 AVG 함수

 -. AVG 함수는 해당 컬럼 값들에 대해 평균을 구하는 함수이다.

급여 평균을 구하는 예제

SQL> SELECT AVG(sal)

          FROM emp;


 

03. 최대 값을 구하는 MAX 함수와 최소 값을 구하는 MIN 함수

 -. 지정한 컬럼 값들 중에서 최대 값을 구하는 함수가 MAX이다.

 -. 지정한 컬럼 값들 중에서 최소 값을 구하는 함수가 MIN이다.
 -.다른 그룹 함수와 달리 이 두 그룹함수는 숫자 타입뿐만 아니라 문자타입, 날짜타입에도 사용가능하다.

 

가장 높은 급여와 가장 낮은 급여를 구하는 예제

SQL> SELECT MAX(sal), MIN(sal)

          FROM emp;


 

문자타입, 날짜타입에도 사용가능한 예제

SQL> SELECT MAX(ename), MIN(ename), MAX(hiredate), MIN(hiredate)

         FROM EMP;



04. 로우의 개수를 세는 COUNT 함수

 -. COUNT 함수는 테이블에서 조건을 만족하는 로우()의 개수를 반환하는 함수이다.

 -. COUNT 함수에 특정 컬럼을 기술하면 해당 컬럼 값을 갖고 있는 로우의 개수를 계사나여 되돌린다.

 

사원 테이블의 사원들 중에서 커미션을 받은 사원의 수를 구하는 예제

SQL> SELECT COUNT(comm)

         FROM emp;


부서번호가 10인 사원중에서 커미션을 받는 사원의 수를 구하는 예제

SQL> SELECT COUNT(comm)

         FROM emp

         WHERE deptno = 10;


직원 테이블에서 직원들의 직업 개수를 카운트하는 예제

SQL> SELECT COUNT(job)

         FROM emp;


에서 총 14건이 산출되었음을 살핀 후 다시 다음과 같은 질의를 한다.

SQL> SELECT job

         FROM emp;

SELECT 결과를 보면 똑같이 14건이 산출됨을 알 수 있다.

    그렇지만 직업이 SALESMAN, MANAGER, CLERK등과 같은 내용이 중복이 되어 있고

    COUNT 함수는 그 중복된 로우를 카운트 했음을 알 수 있다.

 

중복되지 않은 직업의 개수를 카운트하는 예제

SQL> SELECT COUNT(DISTINCT job)

         FROM emp;

DISTINCT : DISTINCT는 중복 행 제거 키워드이다.

 

 -. COUNT 함수를 써서 테이블에 총 몇 개의 행이 들어 있는지를 카운트 할 수도 있다.

 -. 이 경우 특정 컬럼 값이 있는가를 세는 게 아니기에 COUNT 함수 안의 값으로 *를 주어 COUNT(*)  표기한다.

 -. 이때는 테이블에 총 몇 건의 행이 있는가의 문제이기에 설령 어떤 로우는 comm에 널 값이 있어도 상관이 없다.

 -. 그룹함수는 널 값을 제외한다고 하였는데 COUNT(*)만은 예외로 함을 알 수 있다.

SQL> SELECT COUNT(*)

         FROM emp;


⑥ 사원들이 몇 년도에 입사하였는지 조사하여 입사년도 별로 그 해에 입사한 사원들이 인원수를 구하는 쿼리

SQL> SELECT COUNT(*) "total",

         SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1980, 1, 0)) "1980",

         SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1981, 1, 0)) "1980",

         SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1982, 1, 0)) "1980",

         SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1983, 1, 0)) "1980"

         FROM emp;



05. 그룹함수와 단순 컬럼

직원들의 최대 급여를 구하는 쿼리

SQL> SELECT MAX(sal)

          FROM emp;


 

의 결과는 5,000이라는 한 개의 값이 산출된다. 그럼 여기에서 아래와 같이 직원들의 이름을 함께 출력하는 쿼리를 실행한다.

SQL> SELECT MAX(sal), ename

         FROM emp;

에러)

ORA-00937: 단일 그룹의 그룹 함수가 아닙니다

00937. 00000 -  "not a single-group group function"





풀이)

 에러가 발생하는 이유는 위의 그림처럼 그룹 함수의 결과값은 하나인데 비해 그룹 함수를 적용하지 않은 단순 컬럼의 개수는 14개로,

둘의 산출되는 로우가 다르므로 둘을 매치 시킬 수가 없기 때문이다. 5000이라는 값을 SMITH에 붙일 수도 없고 ALLEN에 붙일 수도 없기 때문이다.

※ SELECT LIST에 그룹함수를 사용하는 경우, 그룹함수를 적용하지 않은 단순 컬럼은 올 수 없다는 사실을 명심해야 한다.

반응형