[Oracle] 오라클 GROUPING SETS 사용방법 (소계, 합계)
- 데이터베이스/오라클
- 2020. 4. 28.
오라클에서 소계, 합계, 총계의 쿼리(SQL)를 작성할 때는 ROLLUP을 많이 사용한다. ROLLUP의 경우 나열된 컬럼의 단계별로 소계, 합계를 자동으로 집계를 한다. 그에 반해 GROUPING SETS는 여러 그룹핑 쿼리를 UNION ALL 한 것과 같은 결과를 만들 수 있어 조금 더 유연하게 소계, 합계를 집계할 수 있다.
SELECT job , deptno , COUNT(*) cnt FROM emp GROUP BY GROUPING SETS((job, mgr), (job, deptno), ()) |
GROUPING SETS( 컬럼, 컬럼, 컬럼, ... )
GROUPING SETS( (컬럼그룹), (컬럼그룹), (컬럼그룹), ... )
GROUPING SETS 사용방법
- job 컬럼별 소계와 deptno 컬럼별 소계의 쿼리를 합친 것과 같은 결과가 조회된다.
- SELECT ... GROUP BY job UNION ALL SELECT ... GROUP BY deptno 와 동일
- job, deptno 컬럼을 그룹으로 만들어 소계를 집계할 수 있다.
- SELECT job, deptno, COUNT(*) cnt FROM emp GROUP BY job, deptno 와 동일
- 여러 컬럼 그룹을 사용하여 집계할 수 있다. GROUPING SETS( (컬럼, 컬럼...), (컬럼, 컬럼...), ... )
소계, 합계 구하기
- 빈괄호( )를 추가하여 합계를 표시할 수 있다.
- 빈괄호(빈 괄호( )가 아닌 NULL, ' ' 등을 넣어도 합계가 나오지만 빈 괄호( )를 권장한다.
- 위의 예제는 3개의 쿼리가 합쳐진 것과 같은 결과가 표시된다.
- 최종 합계는 위의 모든 값을 합친 것이 아니라는 것을 명심하자.
- (job, deptno)의 소계와 job의 소계를 표시하여 소계, 합계, 총계를 집계할 수 있다.
GROUPING, GROUPING_ID 함수
- GROUPING 함수는 해당 컬럼의 값이 NULL이면 1, 값이 있으면 0을 리턴 한다.
- GROUPING SETS를 사용하여 생긴 NULL 컬럼만 구별하며, 원 컬럼의 데이터 값이 NULL이면 0을 리턴한다.
- GROUPING_ID 함수는 여러 컬럼을 지정할 수 있으며, 컬럼의 순서대로 NULL이면 1, 값이 있으면 0을 리턴한다.
- job = 0, deptno = 1 인 경우 출력된 값을 문자열로 합쳐서 "01"을 10진수로 변환한다. ("01" => "1")
- job = 1, deptno = 1 인 경우 결과값을 합쳐서 10진수 변환 ("11" => "3")