2.2.5 그룹 함수
데이터 분석 개요
- AGGREGATE FUNCTION
- COUNT, SUM, AVG, MAX
- GROUP FUNCTION
- ROLLUP: 집계함수를 제외하고 소그룹 간의 소계를 계산
- CUBE: GROUP BY 항목 간 다차원적인 소계를 계산
- GROUPING SETS: 특정 항목에 대한 소계를 계산
- WINDOW FUNCTION
GROUPING SETS 함수
- 순서 상 GROUPING SETS가 먼저 오는 게 맞을 것 같음.
- GROUPING SETS: 특정 항목에 대한 소계를 계산
- 원하는 부분의 소계 집합을 만들 수 있음
- 계층 구조인 ROLLUP과는 달리 평등한 관계이므로 인수의 순서가 바뀌어도 결과는 같음.
일반 그룹함수를 이용한 SQL
SELECT DNAME, 'All Jobs' JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME
UNION ALL
SELECT 'All Departments' DNAME, JOB, COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY JOB;
GROUPING SETS 사용 SQL (오라클)
SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME) AS DNAME,
DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS(DNAME, JOB);
- 위 일반 그룹함수에 있던 SELECT 절 두 개를 각각 GROUPING한듯
ROLLUP 함수
- ROLLUP: 집계함수를 제외하고 소그룹 간의 소계를 계산
- 병렬로 수행이 가능하여 매우 효과적
- 그룹핑 컬럼 수(N) + 1 = 소계(N + 1개)
- ROLLUP의 인수는 계층구조이므로 인수 순서가 바뀌면 수행결과도 바뀜
일반적인 GROUP BY 절 + ORDER BY 절
SELECT DNAME, JOB
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB
ORDER BY DNAME, JOB;
ROLLUP 함수 + ORDER BY 절
SELECT DNAME, JOB
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB)
ORDER BY DNAME, JOB;
GROUPING 함수
SELECT DNAME, GROUPING(DNAME),
JOB, GROUPING(JOB),
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);
- ROLLUP이나 CUBE에 의해 소계가 계산된 결과에는 GROUPING(EXPR) = 1
- 그 외의 결과 GROUPING(EXPR) = 0
GROUPING 함수 + CASE 사용
SELECT
CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
CASE GROUPING(JOB) WHEN 1 THEN 'All jobs' ELSE JOB END AS JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);
CUBE 함수
- 소계만 생성한 ROLLUP과는 달리 CUBE는 결합 가능한 모든 값에 대해 다차원 집계를 생성
- 계층구조인 ROLLUP과는 달리, 평등한 관계이므로 인수의 순서가 바뀌어도 정렬은 다를 수 있으나 데이터의 결과는 같음.
- 2의 N승 레벨의 소계 생성
SELECT
CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
CASE GROUPING(JOB) WHEN 1 THEN 'All jobs' ELSE JOB END AS JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE (DNAME, JOB);