Database/SQL

[ORACLE] 집계함수의 SUMMARY 구하기 - ROLLUP 함수

헹창 2021. 10. 28.
반응형

[ORACLE] 집계함수의 SUMMARY 구하기 - ROLLUP 함수

 

 

CR_DTM, CR_TYPE 그룹으로 갯수(CNT) 관련컬럼은 합(SUM)을 비율(RATE) 관련컬럼은 평균(AVG)를 나타내려고 한다.

 

 


 

 

단계 1. 집계 함수 (SUM, AVG)

 

SELECT CR_DTM
     , CR_TYPE
     , SUM(TOTAL_CNT)    AS TOTAL_CNT
     , SUM(MINUTE1_CNT)  AS MINUTE1_CNT
     , AVG(MINUTE1_RATE) AS MINUTE1_RATE
     , SUM(MINUTE2_CNT)  AS MINUTE2_CNT
     , AVG(MINUTE2_RATE) AS MINUTE2_RATE
     , SUM(MINUTE3_CNT)  AS MINUTE3_CNT
     , AVG(MINUTE3_RATE) AS MINUTE3_RATE
     , SUM(MINUTE4_CNT)  AS MINUTE4_CNT
     , AVG(MINUTE4_RATE) AS MINUTE4_RATE
     , SUM(MINUTE5_CNT)  AS MINUTE5_CNT
     , AVG(MINUTE5_RATE) AS MINUTE5_RATE
  FROM EXMP_TABLE
 GROUP BY CR_DTM, CR_TYPE

 

 

 

 

단계 2. ROLLUP 함수

 

SELECT CR_DTM
     , CR_TYPE
     , SUM(TOTAL_CNT)    AS TOTAL_CNT
     , SUM(MINUTE1_CNT)  AS MINUTE1_CNT
     , AVG(MINUTE1_RATE) AS MINUTE1_RATE
     , SUM(MINUTE2_CNT)  AS MINUTE2_CNT
     , AVG(MINUTE2_RATE) AS MINUTE2_RATE
     , SUM(MINUTE3_CNT)  AS MINUTE3_CNT
     , AVG(MINUTE3_RATE) AS MINUTE3_RATE
     , SUM(MINUTE4_CNT)  AS MINUTE4_CNT
     , AVG(MINUTE4_RATE) AS MINUTE4_RATE
     , SUM(MINUTE5_CNT)  AS MINUTE5_CNT
     , AVG(MINUTE5_RATE) AS MINUTE5_RATE
  FROM EXMP_TABLE
 GROUP BY ROLLUP(CR_DTM, CR_TYPE)

 

 

 

GROUP BY ROLLUP (CR_DTM, CR_TYPE) 의 결과를 보면

 

(CR_DTM, CR_TYPE) 그룹의 합계(CR_DTM)의 소계결과가 나온것을 볼 수 있다.

 

 

 

만약 (CR_DTM, CR_TYPE) 의 합계 결과만 보고싶다면 GROUP BY ROLLUP ((CR_DTM, CR_TYPE)) 으로 한번 더 묶어줘야 다음과 같은 결과를 얻을 수 있다.

 

 

 

 

그렇다면 어떤 원리로 ROLLUP 함수가 동작하는 것일까?

 

 


 

 

ROLLUP의 동작원리

 

 

 

1. ROLLUP의 인자로 들어온 컬럼을 오른쪽부터 하나씩 빼면서 GROUP을 만든다.
2. '( )'의 의미는 GROUP이 없는 전체에 대한 집계 결과를 출력한다.
     - 단계2 예제에서 GROUP BY ROLLUP(A, B) 이므로 아래와 같다.
       ① GROUP BY A, B (예제 기준 배경색상 없음)
       ② GROUP BY A    (예제 기준 배경색)
       ③ ( )                  (예제 기준 배경색)
3. 괄호로 묶여있는 컬럼은 하나로 본다.
4. ROLLUP 이전 일반 컬럼과 GROUP BY 하는 경우, 일반 컬럼 GROUP은 끝까지 남는다.

 

 

 

ROLLUP 함수를 몰랐을 때는, 집계함수를 조회해서 서블릿이나 뷰쪽에서 집계함수의 합계를 한번 더 계산하여 그리드 마지막에 표출되도록 커스텀을 했다.

 

 

ROLLUP 함수를 사용하여 해당 합계 행을 ORDER BY를 통해 손쉽게 해결할 수 있었다.

 

 

 

728x90
반응형

댓글

추천 글