dongdorodongdong
그룹함수 본문
AGGREGATE FUNCTION
- GROUP AGGREGATE FUNCTION이라고 부름
- COUNT, SUM, AVG, MAX, MIN 외 각종 집계 함수
GROUP FUNCTION
- ROLLUP, CUBE, GROUPING SETS
- 일반 그룹 함수로 동일한 결과 추출 가능
- 집계 대상 컬럼 이외의 GROUP 대상 컬럼의 값은 NULL을 반환
ROLLUP
- 특징
- GROUP BY의 확장된 형태로 사용하기가 쉬움
- 인자로 주어진 컬럼의 순서에 따라 다른 결과를 추출
- SELECT절에 ROLLUP을 사용함으로써 보통의 SELECT된 데이터와 그 데이터의 총계를 구할 수 있음 - 코드
-
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;
# deptno를 그룹지어서 SUM(집계)
-
SELECT deptno, SUM(sal)
FROM emp
GROUP BY ROLLUP(deptno);
# deptno에 대해서 ROLLUP(deptno의 합계)
-
SELECT deptno, class, SUM(sal)
FROM emp
GROUP BY ROLLUP(deptno, class);
# deptno와 class를 함께 그룹지어서 SUM(집계)
# 우선 class에 대해서 ROLLUP을 하고, 마지막에 deptno에 대해서 ROLLUP
GROUPING
- 특징
- 파라미터의 값이 NULL이면 1, 아니면 0을 반환
- GROUPING 함수에서 사용될 컬럼은 반드시 GROUP BY 절에서 명시 - 코드
-
테이블 : 서비스
테이블 : 서비스가입
-
SELECT
CASE WHEN GROUPING(A.id) = 0 THEN a.id ELSE '합계' END as 서비스id
,CASE WHEN GROUPING(b.dd) = 0 THEN NVL(b.dd,'-') ELSE '소계' END as 가입일자
,count(b.c_id) as 가입건수
FROM
서비스 A LEFT OUTER JOIN 서비스가입 B
ON(a.id = b.id AND b.dd BETWEEN '2013-01-01' AND '2013-01-31')
GROUP BY ROLLUP(a.id, b.dd);
# 서비스ID(A.id)가 NULL이 아니면 A.id가 그대로 반환, NULL이면 '합계'로 반환
# 가입일자(B.dd)가 NULL이 아니면 B.dd가 그대로 반환, NULL이면 '소계로 반환'
# 합계, 소계의 NULL을 떠나 B.dd 자체 값이 NULL이면 NVL에 의해 '-'로 표시(LEFT OUTER JOIN에 의해 NULL값이 생김)
# GROUP BY ROLLUP에 의해서 합계, 소계
CUBE
- 특징
- 결합 가능한 모든 값에 대하여 다차원적인 집계 생성
- ROLLUP에 비해 다양한 데이터를 얻을 수 있음
- 시스템에 부하를 많이 줌
- ROLLUP에 의해 나타나는 값의 합계와 컬럼의 합계를 나타 낼 수 있다. - 코드
-
SELECT deptno, class, SUM(sal)
FROM emp
GROUP BY CUBE(deptno, class);
# ROLLUP과는 다르게 소계 및 합계가 상위에 나타남
# 2,3,4 행은 CUBE에서만 볼 수 있는 행인데, class에 대한 전체 합계도 나타남
# GROUPING SETS((deptno), (class), (deptno, class), ())로 변경할 수 있다.
GROUPING SETS
- 특징
- 원하는 부분의 소계만 손쉽게 추출 가능
- GROUP BY들의 UNION ALL이라고 볼 수 있음 - 코드
-
SELECT deptno, class, SUM(sal)
FROM emp
GROUP BY GROUPING SETS(deptno, class);
# deptno에 대한 GROUP BY와 class에 대한 GROUP BY가 합쳐져있다.