본문 바로가기

DB/SQLD

SQL 활용 - 그룹 함수 (ROLLUP, CUBE)

반응형

그룹 함수

SQL표준 함수 분류

1. AGGREGATE FUNCTION : count , sum , avg , max , min 등 각종 집계 함수

2. GROUP FUNCTION : 결산 개념의 업무, 소계, 중계, 합계, 총 합계등 보고서를 만드는 기능

3. WINDOW FUNCTION : 분석함수나 순위함수 같은 데이터 웨어하우스에서 발전한 기능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
1. ROLLUP 함수
그룹핑된 컬럼의 소계를 생성하기 위해 사용.
그룹핑된 컬럼의 수가 n 이면 소계는 N+1 레벨이 생성
 
SELECT DNAME, JOB, COUNT(*"Total Empl",SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (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);
 
// GROUPING 함수가 컬럼에 추가되었는데
// GROUPING 함수는 ROLLUP이나 CUBE에 의해 소계가 생성되었을때 1이 표시되고 이외에는 0을 표시한다.
// 따라서 소계 필드에 원하는 문자열을 넣는등 보고서쓸때 적절하다.
 
=> ROLLUP 함수 일부 사용
SELECT
    CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
    CASE GROUPING(JOB) WHEN 1 TEHN 'All Jobs' ELSE JOB END AS JOB,
    COUNT(*"Total Empl",
    SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, ROLLUP(JOB);
// 이렇게 ROLLUP을 JOB에만 사용했을 때 결과는 어떨까?
// 결과를 보면 기존과 같이 소계는 나오지만 부서별로 소계를 낼 필요가 없기 때문에
// 총 합계는 나오지 않는다.
 
2. CUBE 함수
ROLLUP함수에서 단순히 소계만 생성했지만, CUBE는 결합 가능한 모든 값에 대하여 다차원 집계를함
* 연산이 많아 시스템에 부담을 줌.
 
SELECT
    CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
    CASE GROUPING(JOB) WHEN 1 TEHN '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);
 
// ROLLUP은 부서별 소계와 총합계까지만 나타내줬으나
// CUBE는 직업(JOB)별로도 소계가 다 구해진다.
 
3. GROUPING SETS 함수
표시된 인수들에 대한 개별 집계를 구할 수 있으며,
ROLLUP인수의 계층구조와 달리 평등한 관계라 순서에 상관없이 동일한결과가 나옴.
 
SELECT DECODE(GROUPING(DNAME), 1'All Departments', DANME) 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);
// 부서별 모든 직업의 소계
// 직업별 모든 부서의 소계
 


요약

ROLLUP : 소그룹간 소계 출력

CUBE : GROUP BY 항목들과 다차원 소계 출력

GROUPING SETS : 특정항목에 대한 소계 출력

* DECODE함수는 CASE문이랑 동일.

반응형

'DB > SQLD' 카테고리의 다른 글

26회 SQLD/SQL개발자 시험 후기, 공부법  (0) 2017.09.09
SQL 활용 - 윈도우 함수  (0) 2017.09.09
SQL 활용 - 서브 쿼리  (0) 2017.09.08
SQL 활용 - 계층형 질의  (0) 2017.09.08
SQL 활용 - 집합 연산자  (0) 2017.09.06