GROUP 함수

1 : GROUPING SETS

이 함수는 오라클 이전 버전에서 UNION ALL등을 사용하여 복잡하게 SQL문장을 만드는 부분을 해소 할 수 있도록 한 GROUP BY의 확장이다. 실습을 통해 이해하자.

a 아래는 기존 함수인 GROUP BY를 이용하여 부서별 직업별, 직업별, 관리자별 각각 그룹핑을 한 후 둘을 합친 결과를 얻는 예제이다.
SQL> SELECT deptno, job, NULL, sum(sal)
2 FROM emp
3 GROUP BY deptno, job
4 UNION ALL
5 SELECT NULL, job, mgr, sum(sal)
6 FROM emp
7 GROUP BY job, mgr;


a 아래는 위의 예문과 같은 결과를 내기 위해 GROUPING SET을 이용한 사례 이다.
SQL> SELECT deptno, job, mgr, sum(sal)
2 FROM emp
3 GROUP BY GROUPING SETS ((deptno, job), (job, mgr));

2: ROLLUP
ROLLUP 함수는 오라클 8i에서 소개된 것으로 주로 GROUP BY와 같이 사용되며 주어진 Grouping 조건에 따라 각 그룹의 그룹핑 항목이 있으면 우측부터 하나씩 제외 하면서 그 결과를 반환한다.


a 아래는 GROUP BY 만을 이용하여 부서별 급여의 합을 구했다.
SQL> select deptno, sum(sal)
2 from emp
3 group by deptno;

DEPTNO SUM(SAL)
---------- ----------
10 6500
20 10875
30 8150
a 아래는 rollup을 group by와 같이 사용하여 부서별 합을 출력하면서 그룹핑 항목인 부서가 제외되는 마지막에 sal의 전체 합을 출력 했다.
SQL> select deptno, sum(sal)
2 from emp
3 group by rollup(deptno);

DEPTNO SUM(SAL)
---------- ----------
10 6500
20 10875
30 8150
25525 ß EMP Table 전체 급여 합계

SQL> select deptno, avg(sal)
2 from emp
3 group by rollup(deptno);

DEPTNO AVG(SAL)
---------- ----------
10 1300
20 2175
30 1630
1701.66667 ß EMP Table 전체 급여 평균

SQL> select deptno, job, sum(sal)
2 from emp
3 group by rollup(deptno, job)

DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 SALESMAN 1250
10 PRESIDENT
10 5000 <==10번 부서 SUBTOTAL
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875 <==20번 부서 SUBTOTAL
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 4350
30 8150 <==30번 부서 SUBTOTAL
24025 <== 전체 TOTAL

3: CUBE

CUBE 함수는 오라클 8i에서 소개된 것으로 이전 ROLLUP 연산자가 수행 한 결과에 부가적으로 그룹핑 조건이 가능한 모든 조합에 대한 결과를 출력한다.


SQL> select deptno, job, sum(sal)
2 from emp
3 group by cube(deptno, job);

DEPTNO JOB SUM(SAL)
---------- --------- ----------
24025 <== 전체 TOTAL
CLERK 4150 <== CLERK SUBTOTAL
ANALYST 6000 <== ANALYST SUBTOTAL
MANAGER 8275 <== MANAGER SUBTOTAL
SALESMAN 5600 <== SALESMAN SUBTOTAL
PRESIDENT <== PRESIDENT SUBTOTAL
10 5000 <==10번 부서 SUBTOTAL
10 CLERK 1300
10 MANAGER 2450
10 SALESMAN 1250
10 PRESIDENT
20 10875 <==20번 부서 SUBTOTAL
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
30 8150 <==30번 부서 SUBTOTAL
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 4350

19 개의 행이 선택되었습니다.


ROLLUP 과 CUBE 차이

select deptno, job, sum(sal)
from emp
group by rollup(deptno, job);
부서별합 + 전체합

select deptno, job, sum(sal)
from emp
group by cube(deptno, job);
부서별합 + 잡별합 + 전체합


이것도 될줄 몰랐었는데 ㅜㅜ
예전에 효인선생님한테 받았음 아주 유용하게 잘썼어요.

+ Recent posts