[81일차] GROUPING SET

저요·2022년 12월 12일

2022 100th day challenge

목록 보기
80/97

GROUPING SET이란?

UNION ALL의 개념이 섞여있는 그룹함수.
여러개의 그룹핑 쿼리를 UNION ALL 한 것과 같은 결과를 만들 수 있어서 유연하게 소계, 합계 집계를 할 수 있다.

GROUPING SET 사용법

어제 사용했던 예제 테이블을 이용해서 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을 적어도 되나, 빈 괄호 표기를 권장하고 있다고 한다.

참고

https://gent.tistory.com/279

profile
웹개발

0개의 댓글