[Oracle] 오라클 GROUPING SETS 사용방법 (소계, 합계)

오라클에서 소계, 합계, 총계의 쿼리(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( (컬럼그룹), (컬럼그룹), (컬럼그룹), ... )

예제쿼리(테이블포함).txt
0.01MB

 

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")

 

댓글

Designed by JB FACTORY