본문 바로가기
Data/MySQL

[MySQL] WITH ROLLUP - 항목별 합계에 대한 전체 합계 구하기

by prinha 2020. 12. 21.
728x90
반응형

WITH ROLLUP

그룹별로 합계를 한 번에 구할 때 사용한다.

GROUP BY를 사용하면 GROUP BY 뒤에 나오는 컬럼별로 합계를 구해주는데,

항목별 합계에 전체 합계가 같이 나오게 하는 것이 WITH ROLLUP이다.


1) WITH ROLLUP 기본 예제

SELECT SUBSTRING(address, 1, 2) as region, gender, COUNT(*)
FROM copang_main.member
GROUP BY region, gender WITH ROLLUP
ORDER BY region ASC, gender DESC;

 

2) HAVING 컬럼 IS NOT NULL

SELECT SUBSTRING(address, 1, 2) as region, gender, COUNT(*)
FROM copang_main.member
GROUP BY region, gender WITH ROLLUP
HAVING region IS NOT NULL
ORDER BY region ASC, gender DESC;

 

SELECT SUBSTRING(address, 1, 2) as region, gender, COUNT(*)
FROM copang_main.member
GROUP BY region, gender WITH ROLLUP
HAVING gender IS NOT NULL
ORDER BY region ASC, gender DESC;


GROUP BY 뒤 기준들의 순서에 따라 WITH ROLLUP의 결과도 달라진다.

그루핑 등장 순서에 따라 계층적인 부분 총계를 보여준다.

 

SELECT YEAR(BIRTHDAY) AS B_YEAR, YEAR(SIGN_UP_DAY) AS S_YEAR, GENDER, COUNT(*)
FROM copang_main.member
GROUP BY B_YEAR, S_YEAR, GENDER WITH ROLLUP
ORDER BY B_YEAR DESC;

 

SELECT YEAR(SIGN_UP_DAY) AS S_YEAR, YEAR(BIRTHDAY) AS B_YEAR, GENDER, COUNT(*)
FROM copang_main.member
GROUP BY S_YEAR, B_YEAR, GENDER WITH ROLLUP
ORDER BY S_YEAR DESC;


NULL임을 나타내기 위해 쓰인 NULL / 부분 총계를 나타내기 위해 쓰인 NULL

SELECT YEAR(SIGN_UP_DAY) AS S_YEAR, GENDER, SUBSTRING(ADDRESS,1,2) AS REGION, COUNT(*)
FROM copang_main.member
GROUP BY S_YEAR, GENDER, REGION WITH ROLLUP
ORDER BY S_YEAR DESC;

 

GROUPING(컬럼)

두 개(형광펜칠해진)의 로우중에서 어떤 것이 부분 총계이고 어떤 것이 원래 있는 NULL을 나타내는 건지 구분할 수가 없다.

이 둘을 구분할 수 있게 해주는 함수가 바로 GROUPING 함수이다.

 

1) 실제로 NULL을 나타내기위해 쓰인 경우에는 0

2) 부분 총계를 나타내기위해 쓰인 경우에는 1을 나타낸다.

SELECT YEAR(SIGN_UP_DAY) AS S_YEAR, GENDER, SUBSTRING(ADDRESS,1,2) AS REGION, 
	GROUPING(YEAR(SIGN_UP_DAY)), GROUPING(GENDER), GROUPING(SUBSTRING(ADDRESS,1,2)), COUNT(*)
FROM copang_main.member
GROUP BY S_YEAR, GENDER, REGION WITH ROLLUP
ORDER BY S_YEAR DESC;

 

 

728x90
반응형