ROLLUP 실전예제1

Updated:


ROLLUP의 실전예제 테이블 생성

rollup은 안시 sql99의 대표적인 함수로 거의 모든 DBMS에서 제공하고 있습니다. 이 함수를 잘 이용하면 동일테이블을 몇번씩 접근해야 하는 SQL들을 단 한번만의 접근으로 처리할수 있는 강력한 기능을 제공하고 있습니다. 아래는 ROLLUP의 기본형태를 이용한 실습예제입니다. ROLL 테이블을 아래의 스크립트로 만들고 실습해봅니다.

create table roll
(gubun varchar2(10),
area_nm varchar2(10),
dept_nm varchar2(20),
kun_no varchar2(10),
corp_nm varchar2(20),
sal number(10));

insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘2군’,’다온네트웍’,100000);
insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘1군’,’다온네트웍’,300000);
insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘2군’,’다온네트웍’,900000);
insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘1군’,’다온네트웍’,800000);
insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘2군’,’정말네트웍’,100000);
insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘1군’,’정말네트웍’,300000);
insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘2군’,’정말네트웍’,200000);
insert into roll values(‘구품관리’,’수도권’, ‘수도지사’, ‘1군’,’정말네트웍’,200000);
insert into roll values(‘구품관리’,’수도권’, ‘경기지사’, ‘2군’,’이온네트웍’,100000);
insert into roll values(‘구품관리’,’수도권’, ‘경기지사’, ‘1군’,’이온네트웍’,300000);
insert into roll values(‘구품관리’,’수도권’, ‘경기지사’, ‘2군’,’다온네트웍’,900000);
insert into roll values(‘구품관리’,’수도권’, ‘경기지사’, ‘1군’,’다온네트웍’,800000);
insert into roll values(‘구품관리’,’수도권’, ‘경기지사’, ‘2군’,’정말네트웍’,100000);
insert into roll values(‘구품관리’,’수도권’, ‘경기지사’, ‘1군’,’이온네트웍’,300000);
insert into roll values(‘구품관리’,’수도권’, ‘경기지사’, ‘2군’,’정말네트웍’,500000);
insert into roll values(‘신품관리’,’수도권’, ‘경기지사’, ‘1군’,’정말네트웍’,700000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘2군’,’다온네트웍’,100000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘1군’,’다온네트웍’,300000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘2군’,’다온네트웍’,900000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘1군’,’다온네트웍’,800000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘2군’,’정말네트웍’,100000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘1군’,’정말네트웍’,500000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘2군’,’정말네트웍’,600000);
insert into roll values(‘구품관리’,’영남권’, ‘부산지사’, ‘1군’,’정말네트웍’,900000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘2군’,’이온네트웍’,100000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘1군’,’이온네트웍’,800000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘2군’,’다온네트웍’,900000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘1군’,’다온네트웍’,800000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘2군’,’정말네트웍’,100000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘1군’,’이온네트웍’,300000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘2군’,’이온네트웍’,800000);
insert into roll values(‘신품관리’,’충남권’, ‘충청지사’, ‘1군’,’이온네트웍’,800000);

commit;

ROLLUP의 실전예제 테이블 설명

테이블의 구성은 아래와 같습니다. GUBUN 칼럼은 구품관리, 신품관리 2개의 값으로 구분되고, AREA_NM은 권역을 나타내는 칼럼으로 수도권, 영남권등의 몇 개의 값으로 되어있습니다. DEPT_NM은 지사를 나타내며 권역별로 몇 개의 지사로 나뉘어집니다. 즉 이런형태의 테이블내의 데이터들이 점점 깊어지는 구조를 가지고 있는 테이블이 ROLLUP을 사용하여 값을 조회하는데 안성맞춤입니다.

GUBUN AREA_NM DEPT_NM KUN_NO CORP_NM SAL
구품관리 수도권 수도지사 2군 다온네트웍 100000
구품관리 수도권 수도지사 1군 다온네트웍 300000
구품관리 수도권 수도지사 2군 다온네트웍 900000
구품관리 수도권 수도지사 1군 다온네트웍 800000
구품관리 수도권 수도지사 2군 정말네트웍 100000
구품관리 수도권 수도지사 1군 정말네트웍 300000
구품관리 수도권 수도지사 2군 정말네트웍 200000
구품관리 수도권 수도지사 1군 정말네트웍 200000
구품관리 수도권 경기지사 2군 이온네트웍 100000
구품관리 수도권 경기지사 1군 이온네트웍 300000
구품관리 수도권 경기지사 1군 이온네트웍 300000
구품관리 수도권 경기지사 2군 정말네트웍 500000
구품관리 수도권 경기지사 1군 정말네트웍 700000
구품관리 영남권 부산지사 2군 다온네트웍 100000
구품관리 영남권 부산지사 2군 정말네트웍 600000
구품관리 영남권 부산지사 1군 정말네트웍 900000
신품관리 충남권 충청지사 2군 이온네트웍 100000
신품관리 충남권 충청지사 1군 이온네트웍 800000
신품관리 충남권 충청지사 2군 다온네트웍 900000
신품관리 충남권 충청지사 2군 이온네트웍 800000
신품관리 충남권 충청지사 1군 이온네트웍 800000

ROLLUP의 실전예제

가. 구품/신품관리 기준으로 Sub TOTAL 보여주기

ROLL 테이블에서 구분 칼럼을 기준으로 구품관리/신품관리 합계를 구하는 SQL입니다. GROUP BY절을 보면 Partial rollup 기술을 사용하여 gubun칼럼이 rollup의 앞에 나와있습니다. 즉 gubun칼럼을 기준으로 서브토탈을 셍성하라는 이야기입니다.

SELECT gubun, area_nm, dept_nm, kun_no, corp_nm, sum(sal)
FROM roll
GROUP BY gubun, ROLLUP ((area_nm, dept_nm, corp_nm, kun_no))
ORDER BY 1, 2, 3;
GUBUN AREA_NM DEPT_NM KUN_NO CORP_NM SAL
구품관리 수도권 경기지사 1군 다온네트웍 800000
구품관리 수도권 경기지사 2군 다온네트웍 900000
구품관리 수도권 경기지사 1군 이온네트웍 600000
구품관리 수도권 경기지사 2군 정말네트웍 600000
구품관리 수도권 경기지사 2군 이온네트웍 100000
구품관리 수도권 수도지사 1군 정말네트웍 500000
구품관리 수도권 수도지사 2군 정말네트웍 300000
구품관리 수도권 수도지사 2군 다온네트웍 1000000
구품관리 수도권 수도지사 1군 다온네트웍 1100000
구품관리 영남권 부산지사 1군 다온네트웍 1100000
구품관리 영남권 부산지사 2군 다온네트웍 1000000
구품관리 영남권 부산지사 2군 정말네트웍 700000
구품관리 영남권 부산지사 1군 정말네트웍 1400000
구품관리         10100000
신품관리 수도권 경기지사 1군 정말네트웍 700000
신품관리 충남권 충청지사 1군 다온네트웍 800000
신품관리 충남권 충청지사 2군 다온네트웍 900000
신품관리 충남권 충청지사 1군 이온네트웍 1900000
신품관리 충남권 충청지사 2군 정말네트웍 100000
신품관리 충남권 충청지사 2군 이온네트웍 900000
신품관리         5300000

나. 구품/신품관리를기준으로 SUB/ALL TOTAL 보여주기

이번에는 구분칼럼을 기준으로 서브토탈을 내고 총합계도 같이 구하는 방법입니다. 이때 rollup의 앞에 있던 GUBNUN 칼럼을 ROLLUP절로 이동시켜 2차원 ROLLUP을 구성합니다.

(area_nm, dept_nm, kun_no, corp_nm) 칼럼을 Grouping on Composite 형태로 묶여있으므로 1개의 칼럼으로 생각하면 된다. 또한 실행계획을 보게 되면 테이블에 1번만 접근한 것을 알수 있습니다.
즉 union all을 여러 번 사용하여 동일한 결과값을 구할수 있겠지만 테이블에 여러 번 접근하므로 속돡 떨어집니다. Rollup은 기본적으로 1번만 접근하는 것을 원칙으로 합니다.

그러나 rollup도 복잡하게 사용하면 with절에 materialize 힌트를 사용한것처럼 temp테이블을 만들고 메모리상에서 여러 번 처리하도록 되어 있습니다. 그래도 union all 형태보다는 속도가 좋을거라 생각합니다.

SELECT gubun, area_nm, dept_nm, kun_no, corp_nm, sum(sal)
FROM roll
GROUP BY ROLLUP (gubun, (area_nm, dept_nm, kun_no, corp_nm))
ORDER BY 1, 2, 3;
Execution Plan
--------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=4 Card=32 Bytes=2K)
   1    0   SORT (GROUP BY ROLLUP) (Cost=4 Card=32 Bytes=2K)
   2    1     TABLE ACCESS (FULL) OF 'ROLL' (TABLE) (Cost=3 Card=32 Bytes=2K)
GUBUN AREA_NM DEPT_NM KUN_NO CORP_NM SAL  
구품관리 수도권 경기지사 1군 다온네트웍 800000  
구품관리 수도권 경기지사 2군 다온네트웍 900000  
구품관리 수도권 경기지사 1군 이온네트웍 600000  
구품관리 수도권 경기지사 2군 정말네트웍 600000  
구품관리 수도권 경기지사 2군 이온네트웍 100000  
구품관리 수도권 수도지사 1군 정말네트웍 500000  
구품관리 수도권 수도지사 2군 정말네트웍 300000  
구품관리 수도권 수도지사 2군 다온네트웍 1000000  
구품관리 수도권 수도지사 1군 다온네트웍 1100000  
구품관리 영남권 부산지사 1군 다온네트웍 1100000  
구품관리 영남권 부산지사 2군 다온네트웍 1000000  
구품관리 영남권 부산지사 2군 정말네트웍 700000  
구품관리 영남권 부산지사 1군 정말네트웍 1400000  
구품관리         10100000  
신품관리 수도권 경기지사 1군 정말네트웍 700000  
신품관리 충남권 충청지사 2군 다온네트웍 900000  
신품관리 충남권 충청지사 1군 다온네트웍 800000  
신품관리 충남권 충청지사 1군 이온네트웍 1900000  
신품관리 충남권 충청지사 2군 정말네트웍 100000  
신품관리 충남권 충청지사 2군 이온네트웍 900000  
신품관리         5300000
          15400000  

다. 지사별로 SUB TOAL 보여주기

이번에는 지사별로 서브토탈을 구하는것입니다. Gubun, area_nm을 왕따(?)시켜 rollup절 앞에 기술합니다. 그리고 나머지 칼럼은 composite 형태로 하나로 묶어서 처리합니다.

SELECT gubun, area_nm, dept_nm, kun_no, corp_nm, sum(sal)
FROM roll
GROUP BY gubun, area_nm, ROLLUP ((dept_nm, kun_no, corp_nm))
ORDER BY 1, 2, 3;
GUBUN AREA_NM DEPT_NM KUN_NO CORP_NM SAL
구품관리 수도권 경기지사 1군 다온네트웍 800000
구품관리 수도권 경기지사 2군 다온네트웍 900000
구품관리 수도권 경기지사 1군 이온네트웍 600000
구품관리 수도권 경기지사 2군 정말네트웍 600000
구품관리 수도권 경기지사 2군 이온네트웍 100000
구품관리 수도권 수도지사 1군 정말네트웍 500000
구품관리 수도권 수도지사 2군 정말네트웍 300000
구품관리 수도권 수도지사 2군 다온네트웍 1000000
구품관리 수도권 수도지사 1군 다온네트웍 1100000
구품관리 수도권       5900000
구품관리 영남권 부산지사 1군 다온네트웍 1100000
구품관리 영남권 부산지사 2군 다온네트웍 1000000
구품관리 영남권 부산지사 2군 정말네트웍 700000
구품관리 영남권 부산지사 1군 정말네트웍 1400000
구품관리 영남권       4200000
신품관리 수도권 경기지사 1군 정말네트웍 700000
신품관리 수도권       700000
신품관리 충남권 충청지사 1군 다온네트웍 800000
신품관리 충남권 충청지사 2군 다온네트웍 900000
신품관리 충남권 충청지사 1군 이온네트웍 1900000
신품관리 충남권 충청지사 2군 정말네트웍 100000
신품관리 충남권 충청지사 2군 이온네트웍 900000
신품관리 충남권       4600000