Rollup

Oracle 2014. 12. 3. 14:29

Rollup과 Cube는?

  • - GROUP BY 구문의 결과에 소계 및 합계 정보를 추가로 나타내 주는 함수
  • - 복잡한 과정 없이 간단한 구문만으로 소계 정보를 쉽게 구할 수 있다.
  • Rollup : 단계별 소계
  • Cube : 모든 경우의 수에 대한 소계

Rollup 기본예제

Rollup 예제 1

아래는 부서별 급여합계와 전체 합계를 조회하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT deptno
     , SUM(sal) s_sal
  FROM emp
 GROUP BY ROLLUP(deptno)
;
 
-- ROLLUP 연산으로 29025 출력
 DEPTNO      S_SAL
------- ----------
     10       8750
     20      10875
     30       9400
             29025

분석: 순서대로 보기 바람.

SELECT deptno
     , SUM(sal) s_sal //1번 월급의 평균
  FROM emp
 GROUP BY ROLLUP(deptno); //deptno 전체를 구룹으로 묶어서 deptno와 s_sal을 한번더 출력해줌.

아래는 UNION ALL을 이용하여 위 ROLLUP 예제와 동일한 결과를 조회하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT deptno
     , SUM(sal) s_sal
  FROM emp
 GROUP BY deptno
 UNION ALL
SELECT NULL deptno
     , SUM(sal) s_sal
  FROM emp
;
 
 
 
 DEPTNO      S_SAL
------- ----------
     30       9400
     20      10875
     10       8750
             29025

Rollup 예제 2

아래는 부서별 사원의 급여와 소계, 그리고 전체 합계(총계)를 조회하는 예제이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT deptno
     , empno
     , SUM(sal) s_sal
  FROM emp
 GROUP BY ROLLUP (deptno, empno)
;
 
 
 DEPTNO      EMPNO      S_SAL
------- ---------- ----------
     10       7782       2450
     10       7839       5000
     10       7934       1300
     10                  8750
     20       7369        800
     20       7566       2975
     20       7788       3000
     20       7876       1100
     20       7902       3000
     20                 10875
     30       7900        950
     30       7499       1600
     30       7521       1250
     30       7654       1250
     30       7698       2850
     30       7844       1500
     30                  9400
                        29025
GROUP BY ROLLUP (DEPTNO, EMPNO) : 롤업의 항목을 오른쪽부터 하나씩 차례로 없애가며 그룹바이한 결과의 합집합

분석:순서대로 보기 바람.

SELECT deptno
     , empno
     , SUM(sal) s_sal
  FROM emp
 GROUP BY ROLLUP (deptno, empno) //1번 그룹을 하는데 deptno와 empno를 기준으로 함 결과는 s_sal로써. deptno를 기준으로 empno의 합을 구해서 출력해주고그담 deptno를 기준으로 전체의 합을 구해줌 ~
;

태그

문서에 대하여

  • - 강좌 URL : http://www.gurubee.net/lecture/2678
  • - 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
  • 구루비의 모든 강좌는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.

--------------------------추가 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ROLLUP operator

ROLLUP구문은 GROUP BY 절과 같이 사용 되며, GROUP BY절에 의해서 그룹 지어진 집합 결과에 대해서 좀 더 상세한 정보를 반환하는 기능을 수행 한다.

SELECT절에 ROLLUP을 사용함으로써 보통의 SELECT된 데이터와 그 데이터의 총계를 구할 수 있다.

간단 예제
 
-- 먼저 GROUP BY를 사용해서 직업별로 급여 합계를 구하는 예제이다.
SQL> SELECT job, SUM(sal)
     FROM emp
     GROUP BY job; 

JOB          SUM(SAL)
---------- ----------
ANALYST         600
CLERK          3200
MANAGER       33925
PRESIDENT      5000
SALESMAN       4000


-- ROLLUP을 사용해서 직업별로 급여 합계와  총계를 구하는 예제이다.
SQL> SELECT job, SUM(sal)
     FROM emp
     GROUP BY ROLLUP(job);
 

JOB          SUM(SAL
---------- ----------
ANALYST         6000
CLERK           3200
MANAGER        33925
PRESIDENT       5000
SALESMAN        4000
               52125   --> 급여 합계에 대한 총계가 추가 되었다.
    

좀 더 복잡한 예제

부서별로 인원수와 급여 합계를 구하는 예제

 
-- GROUP BY절을 사용 한 결과
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, 
            COUNT(a.empno) emp_count
     FROM emp a, dept b
     WHERE a.deptno = b.deptno
     GROUP BY b.dname, a.job

DNAME       JOB               SAL  EMP_COUNT
----------  ---------- ---------- ----------
ACCOUNTING  CLERK            1300          1
ACCOUNTING  MANAGER          2450          1
ACCOUNTING  PRESIDENT        5000          1
RESEARCH    ANALYST          6000          2
RESEARCH    CLERK            1900          2
RESEARCH    MANAGER          2975          1
SALES       MANAGER         28500          1
SALES       SALESMAN         4000          3


-- 부서별로 인원과, 급여합계가 한 눈에 보이지 않는다.
-- 일일이 부서에 해당하는 직업별 급여와 사원수를 일일이 더해야 한다.

-- 이런 경우 ROLLUP을 사용하여 쉽게 조회 할 수 있다. 
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, 
            COUNT(a.empno) emp_count
     FROM emp a, dept b
     WHERE a.deptno = b.deptno
     GROUP BY ROLLUP(b.dname, a.job)


DNAME      JOB               SAL  EMP_COUNT
---------- ---------- ---------- ----------
ACCOUNTING CLERK            1300          1
ACCOUNTING MANAGER          2450          1
ACCOUNTING PRESIDENT        5000          1
ACCOUNTING                  8750          3  -->  ACCOUNTING 부서의 급여 합계와 전체 사원 수
RESEARCH   ANALYST          6000          2
RESEARCH   CLERK            1900          2
RESEARCH   MANAGER          2975          1
RESEARCH                   10875          5 -->  RESEARCH 부서의 급여 합계와 전체 사원 수
SALES      MANAGER         28500          1
SALES      SALESMAN         4000          3
SALES                      32500          4 -->  SALES부서의 급여 합계와 전체 사원 수
                               52125         12 ->  전체 급여 합계와 전체 사원 수
 

-- 위와 같이ROLLUP은 일반적인 누적에 대한 총계를 구할 때 아주 편리하게 사용 할 수 있다.
    
분석:순서대로 보자
SELECT b.dname, a.job, SUM(a.sal) sal, 
            COUNT(a.empno) emp_count
     FROM emp a, dept b

WHERE a.deptno = b.deptno //1번 부서끼리 조인시키고. GROUP BY ROLLUP(b.dname, a.job) //부서명과 직책별로 그룹후 rollup시키고 결과를 출력하는데 부서를 출력후 잡별로 인원카운팅을 하고 하합계도 구하고 부서의 잡의 총 급여와 인원수를 구해주고 최종적으로 전체 합계를 다시 결과로 알려줌.







태그

ROLLUP


문서에 대하여

  • - 강좌 URL : http://www.gurubee.net/lecture/1845
  • - 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
  • 구루비의 모든 강좌는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.


'Oracle' 카테고리의 다른 글

CUBE GROUP BY CUBE  (0) 2014.12.03
GROUPING과 GROUPING_ID  (0) 2014.12.03
KEEP  (0) 2014.12.03
LAG, LEAD (다른 행의 값을 참조)  (0) 2014.12.03
윈도우 함수 WINDOWNING PRECEDING  (0) 2014.12.03
블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,