RDB/Oracle

[ORACLE] 그룹함수 - ROLLUP, CUBE, GROUPING SET

씨네 2022. 1. 1. 09:28
728x90

그룹함수

그룹함수에 조건문을 줄 때는 WHERE이 아닌 HAVING을 사용합니다.

WHERE과 HAVING의 차이는 그룹함수가 있고 없고 차이입니다.

--Q) 부서별 월급 합계를 구하자.(단, 월급의 합계가 7000 이상인 부서만 출력하자.)

SELECT DEPTNO, SUM(SAL) FROM EMP
HAVING SUM(SAL) >= 7000
GROUP BY DEPTNO;

1. ROLLUP

ROLLUP은 순차적으로 중간 합계를 출력합니다.

ROLLUP함수 안 컬럼의 순서가 바뀌면 결과도 바뀌게 됩니다.

ROLLUP의 출력 순서

--EX)
SELECT A, B, COUNT(*) FROM TMP GROUP BY ROLLUP(A,B);
A, B, COUNT(*)
UNION ALL
A, NULL, COUNT(8)
UNION ALL
NULL, NULL, COUNT(*)

--A컬럼, B컬럼에 대한 카운트 / A컬럼에 대한 카운트 / 전체 카운트

--Q) 직업, 부서 별 월급의 합을 출력하자.

SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(JOB, DEPTNO);

2. CUBE

CUBE는 모든 중간합께를 출력합니다.

CUBE의 출력 순서

SELECT A,B,COUNT(*) FROM TMP GROUP BY CUBE(A,B);
NULL, NULL, COUNT(*)
UNION ALL
NULL, B, COUNT(*)
UNION ALL
A, NULL, COUNT(*)
UNION ALL
A, B, COUNT(*)

--Q) 직업, 부서 별 월급의 합을 출력하자.(위와 같은 문제)

SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY CUBE(JOB, DEPTNO);

3. GROUPING SET

GROUPING SET은 원하는 결과를 출력하기 위한 셋팅입니다.

--Q) 직업, 부서 별 월급의 합을 출력하자.(위와 같은 문제)

SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP 
GROUP BY GROUPING SETS(ROLLUP(JOB,DEPTNO), DEPTNO);

 
728x90