티스토리 뷰
grouping sets를 통해 더욱 다양한 소계 집합을 만들 수 있다. 문장을 여러번 반복하지 않아도 원하는 결과를 쉽게 얻을 수 있게 되었다.
그룹함수 종류가 여러가지라 상황에 따라 잘 사용 할 것. 다음 포스팅을 참고
2021.03.29 - [Sql] - 그룹 함수-rollup, rollup orderby, grouping
2021.03.29 - [Sql] - 그룹함수 - cube
* 결론적으로 예시를 통한 간단한 차이는?
rollup : 부서의 Job별 총계, 부서와 job을 포함한 전체 총계를 구할 수 있음
cube : 부서별 총계를 구할 수 있음
grouping sets : 전체 부서별 총계, 전체 Job 별 총계를 구할 수 있음
일반 그룹 함수를 통해서 전체 부서별 총계, 전체 Job 별 총계를 구한다면??
이렇게 union all을 사용하여 테이블 조회를 2번 해야함
하지만 grouping sets를 사용 한다면?
select decode(grouping(DNAME), 1, 'all departments', DNAME) as DNAME
decode(grouping(JOB), 1, 'all jobs', JOB) as JOB
count(*) 'total empl', sum(SAL) 'total sal'
from EMP, DEPT
where DEPT.DEPTNO = EMP.DEPTNO
group by GROUPING SETS(DNAME, JOB)
이렇게 간단하게 작성이 가능하다.
grouping sets 함수 사용시 union all 을 사용한 일반 그룹함수를 사용한 sql과 같은 결과를 얻을 수 있으며, 괄호로 묶은 집합 별로(괄호 내는 계층 구조가 아닌 하나의 데이터로 간주) 집계를 구할 수 있다.
grouping sets의 경우 일반 그룹함수를 이용한 sql과 결과 데이터는 같으나 행들의 정렬 순서는 다를 수 있다.
그리고 하단의 쿼리처럼 순서가 바껴도 결과는 동일하다.
select decode(grouping(DNAME), 1, 'all departments', DNAME) as DNAME
decode(grouping(JOB), 1, 'all jobs', JOB) as JOB
count(*) 'total empl', sum(SAL) 'total sal'
from EMP, DEPT
where DEPT.DEPTNO = EMP.DEPTNO
group by GROUPING SETS(JOB, DNAME) --> 순서바뀜
-----------------------------------------------------------------------------------------------------------------
인수가 3가지로 늘어난다면?
Q. 부서-job-매니저 별 집계와, 부서-job 집계, job-매니저집계를 grouping set 함수를 이용해서 구하는법?
A. 알고 싶은 것 대로 인수를 괄호로 묶기만 하면 된다.
group by grouping sets ((DNAME, JOB, MGR), (DNAME, JOB), (JOB, MGR));
'Sql' 카테고리의 다른 글
인덱스 스캔 방식 및 인덱스 쿼리튜닝 (0) | 2021.03.31 |
---|---|
윈도우함수 ≒ 분석함수 ≒ 순위함수 (0) | 2021.03.29 |
그룹함수 - cube (0) | 2021.03.29 |
그룹 함수-rollup, rollup orderby, grouping (0) | 2021.03.29 |
서브쿼리 (0) | 2021.03.28 |