ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle - GROUP BY 의 ROLLUP과 CUBE
    데이터베이스/Oracle 2020. 11. 11. 17:26
    728x90
    반응형

    ROLLUP / CUBE

    ROLLUPCUBE는 그룹 별 산출한 결과 값의 집계를 계산하는 함수이다.

     

     

    ROLLUP

    ROLLUP이란 인자로 전달받은 그룹 중 가장 먼저 지정한 그룹별로 추가적 집계 결과반환한다.

    즉, 그룹별 '중간집계' 와 '전체 집계'를 계산하여 결과를 행에 자동 추가해주는 함수이다.

     

    [ ROLLUP 예시 ]

    - EMPLOYEE 테이블에서 각 부서 마다 직급 별 급여합, 부서 별 급여 합, 전체 직원 급여 총합 조회

    SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
    FROM EMPLOYEE
    GROUP BY ROLLUP(DEPT_CODE, JOB_CODE)
    ORDER BY 1;

     

     

    CUBE

    CUBE란 인자로 지정된 그룹들로 가능한 모든 조합 별로 집계한 결과 반환한다.

    즉, ROLLUP + 그룹으로 지정된 모든 그룹에 대한 집계 결과를 추가한다.

     

    [ CUBE 예시 ]

    SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
    FROM EMPLOYEE
    GROUP BY CUBE(DEPT_CODE, JOB_CODE)
    ORDER BY 1;

     

     

     

     

    GROUPING

    GROUPING이란 ROLLUP이나 CUBE에 의한 집계 산출물이

    인자로 전달받은 컬럼 집합의 산출물이면 0 반환 아니면 1 을 반환한다.

     

    [ GROUPING 예시 ]

    SELECT DEPT_CODE, JOB_CODE, SUM(SALARY),
        GROUPING(DEPT_CODE) "부서별 그룹",
        GROUPING(JOB_CODE) "직급별 그룹"
    FROM EMPLOYEE
    GROUP BY CUBE(DEPT_CODE, JOB_CODE)
    ORDER BY DEPT_CODE;

     

    GROUPING의 또다른 예시

    SELECT DEPT_CODE, JOB_CODE, SUM(SALARY),
    CASE WHEN GROUPING(DEPT_CODE) = 0 AND GROUPING(JOB_CODE) = 1
    THEN '부서'
        WHEN GROUPING(DEPT_CODE) = 1 AND GROUPING(JOB_CODE) = 0
            THEN '직급'
        WHEN GROUPING(DEPT_CODE) = 1 AND GROUPING(JOB_CODE) = 1
            THEN '총합'
        ELSE '부서+직급'
    END AS 구분
    FROM EMPLOYEE
    GROUP BY CUBE(DEPT_CODE, JOB_CODE)
    ORDER BY DEPT_CODE;

    728x90
    반응형
Designed by Tistory.