2005년 8월 13일 토요일

oracle 8i 이상에서 추가된 함수 rollup & cube

오라클 8i부터
소 그룹간의 소계를 계산하는 ROLLUP 기능과
GROUP BY 항목들간의 다차원적인 소계를 계산 할수 있는 CUBE 기능이 소개되었다.

ROLLUP 은 GROUP BY 의 확장된 형태로 사용하기가 쉬우며 병렬로 수행이 가능하기 때문에
매우 효과적인일 뿐만 아니라 시간 지역 처럼 계층적 분류를 포함하고 잇는 데이타의 집계에 적합하도록 되어 있다.

ROLLUP에 지정된 GROUPING COLUMNS 의 리스트는 SUBTOTAL 을 생성하기 위해 사용되어지며, GROUPING COLUMNS의 수를 N이라 했을때 N+1 레벨의 SUBTOTAL 이 생성된다.

ROLLUP 에서는 단지 가능한 SUBTOTAL 의 SUBSET 만을 생성하였지만,CUBE는 DIMENTION
GROUP 에 대하여 결합 가능한 모든 값에 대하여 CROSS-TABULATION VALUES 을 생성하게 된다.

ROLLUP을 사용할 경우에는 GROUPING COLUMNS의 순서를 바꾸어서 또 한번의 쿼리 를 수행해야 한다. 뿐만아니라 GRAND TOTAL은 양쪽의 쿼리에서 모두 생성이 되므로 한번의 쿼리에서는 제거해야만 한다.

이처럼 GROUPING COLUMNS이 가질 수 있는 모든 경우에 대하여 SUBTOTAL을 생성해야 하는 경우에는 CUBE를 사용하는 것이 바람직하나, ROLLUP에 비해 시스템에 많은 부담을 준다.

ROLLUP 이나 CUBE에 의한 소계가 계산된 결과에는 GROUPING(EXPR)=1 이 표시되고,
그외의 결과에는 GROUPING(EXPR)=0 이 표시된다.

GROUPING 함수와 DECODE 를 이용해, 소계를 나타내는 필드에 원하는 문자열을 지정할 수있다.

--------------------

특히 주의할 점은, Rollup() 내 컬럼의 순서에 따라 결과집합이 달라지므로 그 부분에
대해서는 반드시 인지하고 있어야 한다.

예)