GROUP BY 구문의 결과에 소계, 합계 정보를 같이 보고 싶을 때 어떻게 할까? 이번에 알아 볼 ROLLUP 함수를 사용하면 복잡한 과정 없이 간단한 구문만으로 쉽게 구할 수 있다.
실습은 https://livesql.oracle.com/ 에서 진행하였고, SCOTT 계정의 EMP 테이블을 사용하였다. 일반적으로 사용하는 GROUP BY 문으로 DEPTNO, JOB별 급여의 합을 구해봤다.
위의 GROUP BY 절에 ROLLUP을 추가하여 DEPTNO, JOB별 급여 합 뿐 아니라 전체 급여의 합과 부서별 급여의 합도 같이 구할 수 있다.
그러면, 여기서 전체 급여의 합 또는 부서별 급여의 합 중 하나만 보여 줄 수 있나요? 🙋♂️
이게 되네...?🤔
자, 그러면 ROLLUP이 어떤 원리로 위의 예제 처럼 합을 보여줄 수 있는지 알아보자.
아래의 이미지를 보면 ROLLUP의 원리를 전부 알 수 있다.
ROLLUP은 인자로 들어온 컬럼을 오른쪽부터 하나씩 빼면서 GROUP을 만든다.
()의 의미는 전체에 대한 결과를 출력한다는 의미이고, 괄호로 묶여져 있는 컬럼은 하나로 본다.
ROLLUP 이전에 일반 컬럼과 GROUP BY 한다면 일반 컬럼은 끝까지 남게된다. 참 쉽죠? 👨🎨
위에서 ROLLUP의 원리에 대해 알아봤으니, ROLLUP과 함께 사용하는 GROUPING, GROUPING_ID 그리고 숫자 GROUP에 대해 추가적으로 알아보자.
GROUPING
GROUPING 함수는 해당 컬럼이 ROLLUP 되었을 때, GROUP에서 빠져 있다면 1을 반환한다.
즉, GROUP BY ROLLUP 결과로 NULL이 나왔을 때 1을 반환한다.
GROUPING_ID
GROUPING_ID 함수는 인자로 들어온 각각 컬럼의 GROUPING 함수 값을 2진수로 합쳐 해당 2진수 값을 10진수로 변환한 값을 반환해준다. 말이 어렵긴 한데 아래의 이미지를 참고하자!
숫자 GROUP
결과를 보니 마지막 2줄이 같은 값이 나온 것을 볼 수 있다. 헷갈릴 수 있지만 ROLLUP의 원리를 생각해보면 별 다를 것 없다. JOB과 DEPTNO가 ROLLUP에서 빠지고 1만 남았을때 SUM(SAL)을 구하려고 하고, 상수에 대한 GROUP은 없다.
즉, 전체 행에 대한 결과를 출력하라는 의미와 동일하다.
위의 함수들을 잘 활용하면 아래와 같은 결과를 뽑을 수 있다. 아직 능숙하게 사용하기에는 어렵긴 하지만, 익숙해질 수 있도록 연습하면 편리한 기능으로 보인다!
'💾DB' 카테고리의 다른 글
[ORACLE] LIMIT (0) | 2023.11.13 |
---|---|
[ORACLE] MERGE INTO (0) | 2023.07.13 |
[ORACLE] NVL, NVL2, NULLIF, COALESCE (0) | 2023.06.19 |
[ORACLE] DECODE와 CASE (0) | 2023.06.19 |
[ORACLE] INDEX 타지 않는 경우 (feat. INDEX HINT) (0) | 2022.09.15 |