알고리즘

그룹 함수 (ROLLUP , CUBE , GROUPING SETS)

_IGHT 2020. 11. 26. 20:17

 

1. ROLLUP

 

A컬럼의 서로 다른 원소의 개수가 M개이고 

B컬럼의 서로 다른 원소의 개수가 N개라고 가정하자

 

SELECT A , B , SUM(C)

FROM 테이블_ABC

GROUP BY ROLLUP( A , B )

 

A(1)와 B(1)에 관한 C의 합이 나오고

A(1)와 B(2)에 관한 C의 합이 나오고

...

A(1)와 B(N)에 관한 C의 합이 나오고

해당 A(1) 전체에 관한 C의 합이 나오고

 

A(2)와 B(1)에 관한 C의 합이 나오고

A(2)와 B(2)에 관한 C의 합이 나오고

...

A(2)와 B(N)에 관한 C의 합이 나오고

해당 A(2) 전체에 관한 C의 합이 나오고

 

A(M)와 B(1)에 관한 C의 합이 나오고

A(M)와 B(2)에 관한 C의 합이 나오고

...

A(M)와 B(N)에 관한 C의 합이 나오고

해당 A(M) 전체에 관한 C의 합이 나오고

 

마지막으로 테이블 전체에 관한 C의 합이 나온다.

 

ex)

 

SELECT deptno, job, sum(sal)

    FROM emp

    GROUP BY ROLLUP( deptno , job );

 

 

DEPTNO

JOB

SUM(SAL)

10

CLERK

1300

10

MANAGER

2450

10

PRESIDENT

5000

10

 

8750

20

CLERK

1900

20

MANAGER

6000

20

PRESIDENT

2975

20

 

10875

30

CLERK

950

30

MANAGER

2850

30

PRESIDENT

5600

30

 

9400

 

 

29025

집계 결과

1

deptno, job

부서 번호별
직업별 토탈 월급

2

deptno

부서 번호별
토탈 월급

3

()

전체 토탈 월급

 

<참고>

GROUP BY ROLLUP( deptno , job ) GROUP BY GROUPING SETS( (deptno , job) , deptno , () ) 와 같다.

 

 

 

2. CUBE

 

A컬럼의 서로 다른 원소의 개수가 M개이고 

B컬럼의 서로 다른 원소의 개수가 N개라고 가정하자

 

SELECT A , B , SUM(C)

FROM 테이블_ABC

GROUP BY CUBE( A , B )

 

<위의 sql의 결과>

 

테이블 전체에 관한 C의 합이 나오고

 

[B(1) 관한 C의 합이 나오고

B(2) 관한 C의 합이 나오고

...

B(N) 관한 C의 합이 나오고]

 

A(1)에 관한 C의 합이 나오고

 

[A(1)과 B(1)에 관한 C의 합이 나오고

A(1)과 B(2)에 관한 C의 합이 나오고

...

A(1)과 B(N)에 관한 C의 합이 나오고]

 

A(2)에 관한 C의 합이 나오고

 

[A(2)과 B(1)에 관한 C의 합이 나오고

A(2)과 B(2)에 관한 C의 합이 나오고

...

A(2)과 B(N)에 관한 C의 합이 나오고]

 

...

 

A(M)에 관한 C의 합이 나오고

 

[A(M)과 B(1)에 관한 C의 합이 나오고

A(M)과 B(2)에 관한 C의 합이 나오고

...

A(M)과 B(N)에 관한 C의 합이 나온다.]

 

 

ex)

 

SELECT deptno, job, sum(sal)

    FROM emp

    GROUP BY CUBE( deptno , job );

 

DEPTNO

JOB

SUM(SAL)

 

 

29025

 

CLERK

4150

 

ANALYST

6000

 

MANAGER

8275

 

SALESMAN

5600

 

PRESIDENT

5000

10

 

8750

10

CLERK

1300

10

MANAGER

2450

10

PRESIDENT

5000

20

 

10875

20

CLERK

1900

20

ANALYST

6000

20

MANAGER

2975

30

 

9400

30

CLERK

950

30

MANAGER

2850

30

SALESMAN

5600

 

 

 

 

집계 결과

 

1

()

전체 토탈 월급

2

job

직업별 
토탈 월급

3

deptno

부서 번호별 
토탈 월급

4

deptno, job

부서 번호별 
직업별 토탈 월급

 

GROUP BY CUBE( deptno , job )  GROUP BY GROUPING SETS( () , job , deptno, (deptno , job) ) 와 같다.

 

 

3. GROUPING SETS

 

GROUPING SETS에는 집계하고 싶은 컬럼들을 기술하면 그대로 출력된다.

 

GROUPING SETS 괄호 안에 다음과 같이 집계하고 싶은 컬럼명을 기술하면 기술한대로 결과를 출력해주면 된다.

 

 

GROUPING SETS

출력 결과

GROUPING SETS((deptno), (job), ())

부서 번호별 집계, 직업별 집계, 전체 집계

GROUPING SETS((deptno), (job))

부서 번호별 집계, 직업별 집계

GROUPING SETS((deptno, job), ())

부서 번호와 직업별 집계, 전체 집계

GROUPING SETS((deptno, job))

부서 번호와 직업별 집계

 

 

 

 

4. GROUPING

GROUPING(colum)은 colum이 null일때 0을 반환하고 null이 아니면 1을 반환한다.

 

주로 SELECT 절에서 쓰인다.

 

 

 

 

728x90