Database ~ SQL

[ORACLE] GROUP BY 와 ROLLUP 이 헷갈릴 때

yooverd 2025. 4. 2. 19:54
728x90
반응형
SMALL

 

ROLLUP 은 간단하게 표현하자면 총계 행을 하나 추가하는 것이라고 생각하면 될 것 같다.

 

ROLLUP 그룹화 방법 이해하기

 

GROUP BY 와 ROLLUP 을 활용했을 때, 어떻게 그룹이 만들어지는지 확인해보겠다.

일반적으로 GROUP BY 만 사용하여 그룹화할 컬럼을 지정했다면,

오라클은 지정한 세 컬럼을 이용하여 데이터를 하나의 그룹으로 만든다.

 

그러나 ROLLUP 키워드를 활용하면 오라클은 다르게 그룹을 만들어준다.

지정한 컬럼을 모두 이용한 그룹을 만들고 가장 마지막에 지정된 컬럼부터 하나씩 줄여가며 각각 그룹을 하나씩 만든다.

위의 사진에 대해 설명을 추가해보자면 ROLLUP 대상 컬럼으로 A, B, C 컬럼을 지정하였으므로 오라클은

ABC 컬럼으로 묶은 그룹, AB 컬럼으로 묶은 그룹, A 컬럼으로 묶은 그룹, 그리고 마지막으로 아무 컬럼으로도 묶지 않은 그룹(글 초반에 총계라고 칭한 이유) 이렇게 총 4개의 그룹을 만들어 데이터를 조회한다.

 

그림만 보면 잘 이해가 되지 않으니 실제 데이터를 조회하여 어떤 느낌으로 조합이 되는지 알아보겠다.

 

 

GROUP BY ROLLUP 기본 예시

우선 ROLLUP 을 사용하지 않고 GROUP BY 만 사용해보겠다.

SELECT 
 DEPARTMENT_ID
, JOB_ID
, SUM(tab.SALARY) AS salary_sum
FROM HR.EMPLOYEES
GROUP BY DEPARTMENT_ID, JOB_ID;

앞서 그림에서 보았던 것과 같이 employee들의 데이터를 부서 id 와 직업 id를 이용하여 그룹을 만들고 만들어진 그룹에 대한 Salary의 총합이 구해졌다.

 

 

다음으로 ROLLUP 을 사용해보겠다.

SELECT 
DEPARTMENT_ID
, JOB_ID
, SUM(SALARY) AS salary_sum
FROM HR.EMPLOYEES
GROUP BY ROLLUP(DEPARTMENT_ID, JOB_ID)
ORDER BY DEPARTMENT_ID ASC;

ROLLUP을 사용하면  다음과 같이 조회된다.

위의 그림에서 보여줬던 것처럼 지정된 컬럼을 오른쪽에서 하나씩 빼면서 그룹을 각각 만들어서 집계함수의 결과가 나온다.

나는 처음에 쿼리 결과를 보고 한눈에 이해가 되지 않았어서 혹시나 나처럼 헷갈리는 사람들에게 도움이 될까 싶어서 아래와 같이 그룹을 직접 묶어서 표현해봤다.

DEPT_ID&JOB_ID 그룹(초록), DEPT_ID 그룹(주황), 전체그룹(파랑)

 

결국 ROLLUP 을 사용하면 최초 지정한 그룹별로 계속해서 집계를 해주는 것이라고 생각하면 오히려 이해하기가 편리할 것 같다.

 

 

GROUP BY ROLLUP 활용

집계를 위한 키워드인 만큼 보고싶은 형태에 따라 ROLLUP 도 다양하게 활용해볼 수 있겠다.

ROLLUP 활용의 두가지 예시를 조금 더 참고해보자

 

ROLLUP 대상 컬럼 묶기

지정한 컬럼 모두의 총계가 궁금하지 않을 수도 있다.
부서별 / 직업과 입사일별 / 연봉의 총합이 궁금한 경우를 가정해보자.

그러나 현재 내 테이블은 직업과 입사일에 대한 컬럼이 각각 존재하기 때문에 세 컬럼을 파라미터로 그냥 넘겨버리면 부서별, 직업별, 입사일별 총계가 모두 나오게 될 것이다.

 

이럴 때, 함께 묶고 싶은 컬럼을 소괄호 안에 넣어 파라미터로 넘겨주면 오라클은 해당 컬럼을 함께 묶어 그룹화를 진행한다.

 

 

예시 쿼리는 다음과 같이 짰다.

SELECT 
DEPARTMENT_ID
, JOB_ID
, TO_CHAR(HIRE_DATE, 'YYYY/MM/DD') AS HIRE_DATE
, COUNT(salary) AS number_of_hired
, SUM(SALARY) AS salary_sum
FROM HR.EMPLOYEES
GROUP BY ROLLUP(DEPARTMENT_ID, (JOB_ID, HIRE_DATE));

DEPT_ID JOB_ID&HIRE_DATE / DEPT_ID / 전체 : 총 3개의 그룹이 만들어짐

 

결과를 보면 부서별, 그리고 직업&입사일 별로 총계를 낸 모습을 확인할 수 있다.

 

GROUP BY 따로 ROLLUP 따로 활용하기

그룹화를 시키는데 마지막에 모든 데이터에 대한 전체 총계는 궁금하지 않을 수도 있다.

예를 들어, 부서별 / 직업과 입사일별 급여의 총계가 궁금한데, 이때 모든 데이터의 총계는 궁금하지 않을 수 있다.

집계함수 특성상 컬럼 조회를 하기 위해서는 GROUP BY 에서 선언되지 않은 컬럼은 조회할 수 없는데, 어떻게 해야할까?

 

GROUP BY 에 선언하고 ROLLUP 에 파라미터로 넘기지 않으면 된다.

SELECT 
DEPARTMENT_ID
, JOB_ID
, TO_CHAR(HIRE_DATE, 'YYYY/MM/DD') AS HIRE_DATE
, COUNT(salary) AS number_of_hired
, SUM(SALARY) AS salary_sum
FROM HR.EMPLOYEES
GROUP BY DEPARTMENT_ID, ROLLUP((JOB_ID, HIRE_DATE));

결과를 보면 위의 예시와 컬럼별 총계는 동일하게 나오나 마지막 전체 총계는 나오지 않는 모습을 확인해볼 수 있다.

 

참조

https://dev-jy.tistory.com/68

https://myjamong.tistory.com/191

728x90
반응형
LIST