본문 바로가기
Work/DataBase

[SQLD] 그룹함수 - ROLLUP 예문, 총정리, 사용시 주의사항

GROUP FUNCTION

소그룹 간의 소계를 계산하는 ROLLUP, 

다차원적인 소계를 계산하는 CUBE, - 글 바로가기

특정항목에 대한 소계를 계산하는 GROUPING SETS 함수 총 3가지가 있습니다. - 글 바로가기

 

 

이중 컬럼을 그룹화여 부분합, 합계, 소계 등을 할수있는 그룹함수에 대해서 알아보자

 

1. ROLLUP 함수 

롤업은 소계를 위해 사용되는 함수이며, 모든 그룹함수는 group by와 함께 쓰인다

select * from test1

예제에 사용할 test1 테이블

Rollup은 Aggregation함수 (sum, count, 등 )과 함께  그룹화 기준을 통해 소계를 내는데 유용하게 쓰인다.

 

 

ex > rollup + count(*)

select col1,col2,count(*) 
  from test1 
 group by rollup(col1,col2) 

 

ex > rollup + sum()

select col1,sum(col2) as COL2합
  from test1 
 group by rollup(col1) 

 

 

 

실전 응용 EX > C_CUST_BASE 라는 기업의 고객테이블

-- rollup은 그룹화의 sub합
select NVL(AGES_DIV_CD,'합') 연령대 
       ,case SEX_CD when '1' then '남자' when '2' then '여자' else 'subtotal' end as 성별
       ,count(*) 고객수
  from c_Cust_base
group by rollup (AGES_DIV_CD, SEX_CD)
order by AGES_DIV_CD
;

c_cust_base라는 고객 테이블을 이용해  성별, 연령대별 고객수를 뽑았다. (NVL, case문은 안보셔도 무방합니다)

연령대별, 성별 고객의 수를 구하는데, 여기서 중요한것은 rollup은 group by 순서가 중요하다. 

 

 


Rollup 사용시 주의할점!

그룹화 순서변경시 subtotal 값 생성 기준이 변경된다.!

 

-- rollup은 그룹화의 sub합
select NVL(AGES_DIV_CD,'합') 연령대 
       ,case SEX_CD when '1' then '남자' when '2' then '여자' else 'subtotal' end as 성별
       ,count(*) 고객수
  from c_Cust_base
group by rollup (sex_cd,AGES_DIV_CD)
order by sex_cd 
;

 

group by rollup (AGES_DIV_CD, SEX_CD)   -> (SEX_CD , AGES_DIV_CD)

(보는데 편이를 위해 값은 order by 기준을 재정렬해주었음 주목할것은 그룹화 순서임)