UNION ALL의 개념이 섞여있는 그룹함수.
여러개의 그룹핑 쿼리를 UNION ALL 한 것과 같은 결과를 만들 수 있어서 유연하게 소계, 합계 집계를 할 수 있다.
어제 사용했던 예제 테이블을 이용해서 GROUPING SET을 실행해 보도록 하겠다.
SELECT enpnm
,ymd
,sum(val) as val
from saleTable
group by grouping sets(enpnm, ymd);

이름과 년도 기준으로 grouping sets를 한 결과, 이름으로의 소계와 날짜그룹의 소계가 각각 따로 구해져서 UNION ALL 과 같은 결과로 합쳐져 있는 것을 볼 수 있다.
ROLLUP에서는 ()안에서 또 괄호로 묶으면 그 해당 컬럼들을 기준으로 한 소계는 보여주지 않는다. 그렇다면 GROUPING SETS에서는 어떨까?
SELECT enpnm
,ymd
,sum(val) as val
from saleTable
group by grouping sets((enpnm, ymd), ());

이름과 날짜로 그룹핑 되어서 소계가 구해진다. GROUPING SET에서는 괄호안에서 괄호로 묶으면 그 묶음을 그룹으로 소게를 구하기 때문이다.
다음과 같은 모양새도 가능하다.
SELECT enpnm
,custnm
,ymd
,sum(val) as val
from saleTable
group by grouping sets((enpnm, ymd), (custnm, ymd));

합계를 구하고 싶을 때는 다음과 같이 실행하면 된다.
SELECT enpnm
,ymd
,sum(val) as val
from saleTable
group by grouping sets(enpnm, ymd, ());

다음과 같이 총 합계가 구해진다. 이때 빈 괄호 대신 NULL을 적어도 되나, 빈 괄호 표기를 권장하고 있다고 한다.