쌓고 쌓다

[Oracle] ROLLUP, CUBE, GROUPING 본문

프로그래밍/SQL

[Oracle] ROLLUP, CUBE, GROUPING

승민아 2022. 10. 31. 21:00

ROLLUP 예제

1) 소속 학과별로 교수 급여 합계와 모든 학과 교수들의 합계를 출력

SELECT deptno, SUM(sal)
FROM professor
GROUP BY ROLLUP(deptno) ORDER BY deptno;

 

ROLLUP(deptno)의 결과

1. (deptno) 

2. 전체 합계 

 

2) 학과 및 직급별 교수 수, 학과별 교수 수, 전체 교수 수를 출력하라

SELECT deptno, position, COUNT(*)
FROM professor
GROUP BY ROLLUP(deptno, position) ORDER BY deptno;

ROLLUP(deptno, position)의 결과

1. (deptno, position)

2. (deptno)

3. 전체 합계

 

 

ROLLUP(A, B, C)라고 하면 아래의 순서로 결과가 나온다.

1. (A, B, C)

2. (A, B)

3. (A)

4. 전체 합계

=> 규칙이 있다.

 

CUBE 예제

1) 학과 및 직급별 교수 수, 학과별 교수 수, 직급별 교수 수, 전체 교수 수를 출력

SELECT deptno, position, COUNT(*)
FROM professor
GROUP BY CUBE(deptno, position) ORDER BY deptno;

CUBE(deptno, position)의 결과

(1) (deptno, position)

(2) (deptno)

(3) (position)

(4) 전체 교수 수

 

GROUPING 함수

인수로 지정된 칼럼이 ROLLUP이나 CUBE 연산자, 그룹 함수에 사용되었는지 여부를 반환

( 사용:0, 미사용:1 )

 

1) 학과와 학년별 인원수, 학과별 인원수를 출력해서 각 그룹에 학과, 학년 칼럼이 사용 여부를 확인해보자.

SELECT deptno, grade, COUNT(*), GROUPING(deptno), GROUPING(grade)
FROM student
GROUP BY ROLLUP(deptno, grade) ORDER BY deptno;

1번, 3번, 5번, - 학과,  학년별 인원수를 구할 때 deptno, grade가 모두 사용되었다.

2번, 4번, 6번 - 학과별 인원수를 구할 때 학과(deptno)만 사용되었다.

7번 - 전체 인원수를 구할때 deptno, grade는 사용되지 않았다.

'프로그래밍 > SQL' 카테고리의 다른 글

[Oracle] HAVING  (0) 2022.10.31
[Oracle] GROUPING SETS  (0) 2022.10.31
[Oracle] GROUP BY(그룹핑), 그룹 함수  (0) 2022.10.20
[Oracle] DECODE, CASE 함수  (0) 2022.10.08
[Oracle] NVL, NVL2, NULLIF, COALESCE  (0) 2022.10.08
Comments