Group By
집계 함수를 사용할 때 그 외의 컬럼들을 묶는데 사용한다. "부서별 급여", "직급별 급여"와 같이 "~별"을 정의하는 절(Clause)이다.
SELECT d.DEPARTMENT_NAME AS "부서명", j.JOB_TITLE AS "직급명", SUM(e.SALARY) AS "부서 총 급여"
FROM EMPLOYEES e, DEPARTMENTS d, JOBS j
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND e.JOB_ID = j.JOB_ID
GROUP BY d.DEPARTMENT_NAME, j.JOB_TITLE
ORDER BY DEPARTMENT_NAME, JOB_TITLE;

ROLLUP
ROLLUP은 이름처럼 컬럼을 하나씩 말아올리는(?) 형식의 그룹 함수이다. ROLLUP에 제시된 컬럼은 우측에서부터 하나씩 지우며 "총합"을 구하게 된다.
예를들어 ROLLUP(부서명, 직급명)이 있을 때, (1)부서의 직급별 급여, (2)부서별 급여, (3)전체 급여의 결과가 나온다.
SELECT d.DEPARTMENT_NAME AS "부서명", j.JOB_TITLE AS "직급명", SUM(e.SALARY) AS "부서 총 급여"
FROM EMPLOYEES e, DEPARTMENTS d, JOBS j
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND e.JOB_ID = j.JOB_ID
GROUP BY ROLLUP(d.DEPARTMENT_NAME, j.JOB_TITLE)
ORDER BY DEPARTMENT_NAME, JOB_TITLE;

CUBE
구할 수 있는 모든 조건의 집계를 구한다.
SELECT d.DEPARTMENT_NAME AS "부서명", j.JOB_TITLE AS "직급명", SUM(e.SALARY) AS "부서 총 급여"
FROM EMPLOYEES e, DEPARTMENTS d, JOBS j
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND e.JOB_ID = j.JOB_ID
GROUP BY CUBE(d.DEPARTMENT_NAME, j.JOB_TITLE)
ORDER BY DEPARTMENT_NAME, JOB_TITLE;


GROUPING SETS
집계를 구할 컬럼을 지정한다. GROUPING SETS()에 작성한 하나의 인자가 GROUP BY로 묶이는 듯한 형식이다.
예를들어 GROUP BY GROUPING SETS((부서명, 직급명), 부서명) 의 경우 (1)부서의 직급별 급여, (2)부서별 급여 의 집계를 조회할 수 있다. GROUPING SETS에서 일반 GROUP BY에서 조회할 수 있는 부서의 직급별 급여를 구하기 위해서는 반드시 (부서명, 직급명) 컬럼을 괄호로 묶어 하나의 인자처럼 제공해야한다.
SELECT d.DEPARTMENT_NAME AS "부서명", j.JOB_TITLE AS "직급명", SUM(e.SALARY) AS "부서 총 급여"
FROM EMPLOYEES e, DEPARTMENTS d, JOBS j
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND e.JOB_ID = j.JOB_ID
GROUP BY GROUPING SETS((d.DEPARTMENT_NAME, j.JOB_TITLE), d.DEPARTMENT_NAME)
ORDER BY DEPARTMENT_NAME, JOB_TITLE;

또한 GROUPING SETS()의 경우 빈 괄호를 인자로 제공할 수 있는데 이 경우에는 전체 집계를 구할 수 있다.
SELECT d.DEPARTMENT_NAME AS "부서명", j.JOB_TITLE AS "직급명", SUM(e.SALARY) AS "부서 총 급여"
FROM EMPLOYEES e, DEPARTMENTS d, JOBS j
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND e.JOB_ID = j.JOB_ID
GROUP BY GROUPING SETS((d.DEPARTMENT_NAME, j.JOB_TITLE), ())
ORDER BY DEPARTMENT_NAME, JOB_TITLE;

'데이터베이스 > Oracle' 카테고리의 다른 글
| [OracleDB] SELECT절을 위한 컬럼명 생성 함수 (0) | 2023.06.15 |
|---|---|
| [OracleDB] 실행계획 (Execution Plan) (0) | 2023.06.15 |
| [OracleDB] 계층형 쿼리 (0) | 2023.06.14 |
| [PL/SQL] 반복문 (Loop) (0) | 2023.06.14 |
| [PL/SQL] 커서(Cursor) (0) | 2023.06.14 |