본문 바로가기

SQL

[오라클] rollup과 cube 한방에 이해하기

오라클 group by절에 사용되는 rollup과 cube는 편리한 함수입니다.
이 함수들이 없다면 데이터 복제를 통해 group by된 값의 sum(총계)등을 통해
구현해야 합니다. 그러지 않으면 어플리케이션에서 해야 겠죠.
편리함에도 불구하고 rollup과 cube가 자꾸 햇갈립니다.
아래 공식으로 한방에 이해해 보죠.
1. rollup  ( group by절 오른쪽 컬럼부터 삭제하며 그룹을 생성하라)
ex) select a, b, count(*)
      from tmp
      group by rollup(a,b)
-- 나올수 있는 집합
 a, b, count(*)
 union all
 a, null, count(*)
 union all
 null, null, count(*)
==> 오른쪽 컬럼인 b부터 null로 대체 되면서 그룹이 생성됩니다.
      위의 예제는 총 3개의 집합이 생성되겠죠.

2. cube (group by절에 기술된 컬럼이 조합될 수 있는 모든 경우의 집합을 생성하라)
ex) select a, b, count(*)
      from tmp
      group by rollup(a,b)
-- 나올수 있는 집합
 a, b, count(*)
union all
 a, null, count(*)
union all
null, b, count(*)
unoin all
null, null, count(*)
==> rollup에 비해 null, b, count(*)인 집합이 추가로 생성된걸 볼 수 있습니다.


3. grouping sets (  comma(,)를 union으로 바꿔서 group by절을 계속 생성하라) ... 9i부터 사용할 수 있음
ex) select a, b, sum(c)
      from tmp
      group by
      grouping sets (a, b)
  -- 나올 수 있는 집합
 group by a
 union all
 group by b 

참고 :  http://scidb.tistory.com/