본문 바로가기
IT/Database

그룹함수 (GROUP BY, ROLLUP, CUBE, GROUPING-SET, GROUPING)

by 성준하이 2023. 11. 2.
반응형

sql 쿼리에는 그룹을 지정할수 있는 문법이 존재하는데 Group by 와 함께 사용되는 다른 문법들도 예제와 함께 알아볼 것이다.

 

예시 데이터

이름 월급
홍길동 2023.01 10,000
홍길동 2023.02 15,000
이순신 2023.01 20,000
이순신 2023.02 25,000
유관순 2023.01 0
유관순 2023.02 50,000

 

Group By

SELECT 이름, 월, SUM(월급) AS 월급 FROM TABLE GROUP BY 이름, 월;

이름 월급
홍길동 2023.01 10,000
홍길동 2023.02 15,000
이순신 2023.01 20,000
이순신 2023.02 25,000
유관순 2023.01 0
유관순 2023.02 50,000

이름 과 월 기준으로 그룹이 되어 출력이 되었다.

만약 이름기준으로 월급 SUM을 하면 3개 로우가 나오게 될것이다.

 

지금부터 나오는 함수는 GROUP BY 이하 절에 사용되는 함수이다.

ROLLUP

SELECT 월, 이름, SUM(월급) AS 월급 FROM TABLE GROUP BY ROLLUP(월,이름);

이름 월급
2023.01 홍길동 10,000
2023.01 이순신 20,000
2023.01 유관순 0
2023.01 (null) 30,000
2023.02 홍길동 15,000
2023.02 이순신 25,000
2023.02 유관순 50,000
2023.02 (null) 90,000
(null) (null) 120,000

GROUP BY 에 비해 소계와 총 계가 나오는것이 특징이다.

첫번째 인자는 마지막에 한번만 총계때 필요하고 두번째 인자는 첫번째 인자 그룹 마다 한번씩 소계를 낸다.

 

 

CUBE

SELECT 월, 이름, SUM(월급) AS 월급 FROM TABLE GROUP BY CUBE(월,이름);

이름 월급
(null) (null) 120,000
(null) 홍길동 25,000
(null) 이순신 45,000
(null) 유관순 50,000
2023.01 홍길동 10,000
2023.01 이순신 20,000
2023.01 유관순 0
2023.01 (null) 30,000
2023.02 홍길동 15,000
2023.02 이순신 25,000
2023.02 유관순 50,000
2023.02 (null) 90,000

ROLLUP에 비해 첫번째 인자 별로도 group 이 묶이는것을 볼수 있다.

그룹이 가질수 있는 모든 경우의 수에 대해서 소계와 총계가 나온다.

 

 

GROUPING SETS

SELECT 월, 이름, SUM(월급) AS 월급 FROM TABLE GROUP BY GROUPING SETS(월,이름);

이름 월급
2023.01 (null) 30,000
2023.02 (null) 90,000
(null) 홍길동 25,000
(null) 이순신 45,000
(null) 유관순 50,000

Group by 의 결과와는 조금 다르다.

각 인자별 소계의 정보만 출력이 된다.

그리고 GROUPING SETS 은 하나의 인자가 아니라 두개를 묶어서도 사용이 가능하다.

 

SELECT 월, 이름, SUM(월급) AS 월급 FROM TABLE GROUP BY GROUPING SETS( 월, 이름 , (월,이름) , () );

이럴 경우 각 인자별로 그룹의 소계가 나온다.

이름 월급
2023.01 (null) 30,000
2023.02 (null) 90,000
(null) 홍길동 25,000
(null) 이순신 45,000
(null) 유관순 50,000
2023.01 홍길동 10,000
2023.02 홍길동 15,000
2023.01 이순신 20,000
2023.02 이순신 25,000
2023.01 유관순 0
2023.02 유관순 50,000
(null) (null) 120,000

눈치가 빠르신 분들은 눈치 챘겠지만 바로 위 GROUPING SETS( 월, 이름 , (월,이름) , () ); 의 함수는 CUBE의 대체이다.

월별, 이름별, (월,이름) 별 , 그리고 전체를 기준으로 각 묶어서 그룹 결과를 내면 이와 같다.

 

그럼 ROLLUP 을 GROUPING SET으로 하면 어떻게 될까?

GROUPING SETS ((월,이름), 월, () ); 

이 된다.

 

 

마지막으로

GROUPING 함수

GROUPING 함수는 위에 명시된 ROLLUP, CUBE, GROUPING SETS 를 지원하는 함수이다.

집계된 결과에 GROUPING(표현식) = 1 이 되며, 그 외에는 GROUPING(표현식) = 0 이 된다.

아래와 같다.

SELECT

CASE GROUPING(월) WHEN 1 THEN '모든 월' ELSE 월 END AS 월,

CASE GROUPING(이름) WHEN 1 THEN '모든 이' ELSE 이름 END AS 이름,

SUM(월급) AS 월급

FROM TABLE

GROUP BY CUBE(월,이름);

이름 월급
모든 월 모든 이 120,000
모든 월 홍길동 25,000
모든 월 이순신 45,000
모든 월 유관순 50,000
2023.01 홍길동 10,000
2023.01 이순신 20,000
2023.01 유관순 0
2023.01 모든 이 30,000
2023.02 홍길동 15,000
2023.02 이순신 25,000
2023.02 유관순 50,000
2023.02 모든 이 90,000
반응형

댓글