Dream Lovers

SQL 그룹함수 (ROLLUP, CUBE, GROUPING_ID, GROUPING SETS) 본문

SQL 쿼리 테스트/Tips

SQL 그룹함수 (ROLLUP, CUBE, GROUPING_ID, GROUPING SETS)

yun.bagus 2023. 9. 7. 00:15
ROLLUP  

부분합(subtotal)을 구해주는 grouping 함수

입력한 위계를 기반으로 합계를 구해준다. 

SELECT
컬럼1,
컬럼2,
SUM(컬럼3)
FROM 테이블명
GROUP BY ROLLUP(컬럼1, 컬럼2) ;

(컬럼1, 컬럼2) 끼리의 값이 출력되고

(컬럼1)를 중심으로 그룹을 묶어서 subtotal이 계산됨

() 전체 총계

SELECT
컬럼1,
컬럼2,
컬럼3,
SUM(컬럼3)
FROM 테이블명
GROUP BY ROLLUP(컬럼1, 컬럼2, 컬럼3) ;

(컬럼1, 컬럼2, 컬럼3)  끼리의 값이 출력되고

(컬럼1, 컬럼2) 묶음의 subtotal 출력

(컬럼1)을 중심으로 subtotal 

() 전체 집계 값

SELECT 
NVL(sub_region_id,0) AS sub_region_id,
NVL(organization_region_id,0) as organization_region_id,
SUM(population)
FROM eba_countries
GROUP BY ROLLUP (NVL(sub_region_id,0), NVL(organization_region_id,0))
 ;

 

CUBE

부분합(subtotal)을 구해주는 grouping 함수 

ROLLUP과 기능이 비슷하지만, 모든 컬럼을 조합하여 부분합을 구해준다는 차이점이 있다. 

SELECT
컬럼1,
컬럼2,
SUM(컬럼3)
FROM 테이블명
GROUP BY CUBE(컬럼1, 컬럼2) ;

 

(컬럼1, 컬럼2) 묶음의 subtotal 출력

(컬럼1)을 중심으로 subtotal 

(컬럼2)을 중심으로 subtotal 

() 전체 집계 값

SELECT
컬럼1,
컬럼2,
컬럼3
SUM(컬럼3)
FROM 테이블명
GROUP BY CUBE(컬럼1, 컬럼2, 컬럼3) ;

(컬럼1, 컬럼2, 컬럼3)

(컬럼1, 컬럼2)

(컬럼1, 컬럼3)

(컬럼2, 컬럼3)

(컬럼1)

(컬럼2)

(컬럼3) 조합의 부분합이 생성됨

 

GROUPING_ID

현재 행이 총계인지, 부분합인지 명시해주는 함수 (flag 역할을 한다)

GROUP BY 절과 함께 SELECT 절 내에서 사용됨 

이 때 숫자는 전체 총합이 가장 큰 수를 가짐

EX. GROUPING_ID( 컬럼1, 컬럼2)

GROUP_ID = 0 (컬럼1, 컬럼2)

GROUP_ID = 1 (컬럼1)

GROUP_ID = 2 (컬럼2)

GROUP_ID = 3 ( )  

SELECT
NVL(region_id,0),
NVL(sub_region_id,0),
GROUPING_ID(NVL(region_id,0),NVL(sub_region_id,0)),
SUM(population)
FROM eba_countries
GROUP BY ROLLUP(NVL(region_id,0),NVL(sub_region_id,0));

 

GROUPING SETS

ROLLUP이나 CUBE와 다르게, 사용자가 직접 그룹핑할 수 있는 함

SELECT
컬럼1,
컬럼2,
SUM(컬럼3)
FROM 테이블명
GROUP BY
GROUPING SET((컬럼1, 컬럼2),컬럼2) ;

(컬럼1, 컬럼2)

(컬럼2)

GROUPING SET( (컬럼3, 컬럼2), (컬럼2,컬럼1), 컬럼1)) 의 경우,

(컬럼3, 컬럼2)

(컬럼2, 컬럼1)

컬럼1 의 형태로 부분합을 구하게 된다.

SELECT 
NVL(region_id,0),
NVL(sub_region_id,0),
NVL(organization_region_id,0),
SUM(population)
FROM eba_countries
GROUP BY GROUPING SETS ((NVL(region_id,0),NVL(sub_region_id,0)), (NVL(sub_region_id,0),NVL(organization_region_id,0)))
 ;