본문 바로가기
백엔드/SQLD

GROUP BY, GROUPING SETS, ROLLUP, CUBE

by 1005ptr 2020. 11. 22.
반응형

GROUP BY는 집계 함수

ROLLUP, CUBE, GROUPING SETS 함수는 그룹핑 시에 서브토탈을 계산할 수 있다.

 

GROUP BY

GROUP BY ROLLUP

GROUP BY CUBE

GROUP BY GROUPING SETS

 

1. ROLLUP

순서대로 집계함수를 만든다.

GROUP BY ROLLUP(DNAME, JOB)

 -- a. DNAME, JOB 그룹 전체의 토탈

 -- b. DNAME 그룹 별 서브 토탈

 -- c. DNAME, JOB 그룹핑

 

내가 이해하기로는 이렇게 토탈데이터를 생성한다.

a 를 생성한 이후에

GROUP BY DNAME ROLLUP(JOB)으로 바뀌고

DNAME 그룹 별로 JOB을 ROLLUP한 서브토탈 Record b 를 생성

b를 생성한 이후에

GROUP BY DNAME, JOB이 됐으니

DNAME, JOB 기준 그룹핑 Record들이 생성

된다고 생각하면 문법이 이해가 쉽다.

 

왜냐하면 이렇게도 사용가능하기 때문

ROLLUP 함수 일부 사용 -- GROUP BY DNAME, ROLLUP(JOB) --> a만 생성되지 않는다.

ROLLUP 함수 결합 칼럼 사용 -- GROUP BY ROLLUP (DNAME, (JOB, MGR)) --> DNAME, JOB의 서브토탈은 생성되지 않는다. 전체 서브토탈, DNAME의 서브토탈만 생성된다.

 

 

2. CUBE

CUBE는 ROLLUP 함수에서 더 나아나서 모든 속성 조합으로 서브토탈을 만든다.

GROUP BY CUBE(DNAME, JOB)

 -- a. DNAME, JOB 그룹 전체의 토탈

 -- b. DNAME 그룹 별 서브토탈

 -- c. JOB 그룹 별 서브 토탈

 -- d. DNAME, JOB 그룹핑

 

3. GROUPING SETS

GROUPING SETS는 사용자 정의 집계 함수 같은 느낌

ROLLUP이나 CUBE는 정해진대로 서브토탈을 줄줄이 뱉어내지만 GROUPING SETS는 필요한 정보를 직접 선택해서 뿌릴 수 있다.

GROUPING SETS 안에 줄줄이 적으면 각각을 GROUP BY한 쿼리를 UNION ALL 한 결과와 같다.

ROLLUP(DNAME, JOB) --> GROUPING SETS(null, DNAME, (DNAME, JOB)) --> 순서대로 a, b, c 데이터를 의미

CUBE(DNAME, JOB)    --> GROUPING SETS(null, DNAME, JOB, (DNAME, JOB)) --> 순서대로 a, b, c, d 데이터를 의미

반응형

'백엔드 > SQLD' 카테고리의 다른 글

제약조건[CHECK]  (0) 2020.11.22
제약조건[IDENTITY]  (0) 2020.11.22
TRUNC, CEIL, FLOOR, ROUND  (0) 2020.11.18
NULLIF, COALESCE, NVL, NVL2, DECODE, CASE  (0) 2020.11.12
IN, NOT IN, EXISTS, NOT EXISTS에서 NULL의 동작  (0) 2020.11.11

댓글