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 |
댓글