MSSQL ROLLUP, GROUPING 사용법 – 소계, 합계 구하기
MS SQL에서 소계(부분합), 합계를 구하기 위해서 GROUP BY절에 ROLLUP 구문을 사용하시면 됩니다. 그리고 GROUPING 집계 함수를 사용하여 원하는 문구도 변경을 할 수 있습니다. 조회 화면에서 자주 사용되는 쿼리문입니다.
그럼 간단한 예제를 통해서 ROLLUP 구문과 GROUPING 집계 함수를 사용하여 소계 및 합계를 구하는 방법에 대해서 알아보죠.
포스트 기준
– Microsoft SQL Server 2019
– SSMS 18.11
1. 샘플 데이터
▶ 수강과목 점수 데이터 : 18건
-- 1) 샘플 데이터 (18건) : 수강과목 점수
SELECT P_ID AS '학번',
NAME AS '성명',
DEPART AS '학과',
GRADE AS '학년',
SUBJECT AS '수강과목',
SCORE AS '점수'
FROM BS_DEMO_8_4
ORDER BY GRADE, S_ID
![ROLLUP 구문 사용으로 소계, 합계 구하기 에제 코드 실행 결과](https://bluesharehub.com/wp-content/uploads/2022/03/img_1-34.png)
![ROLLUP 구문 사용으로 소계, 합계 구하기 에제 코드 실행 결과](https://bluesharehub.com/wp-content/uploads/2022/03/img_1-34.png)
2. ROLLUP 구문 사용으로 소계, 합계 구하기
1. 구문(Syntaxsql)
※ Microsoft 기술 문서
![ROLLUP 구문 Microsoft 기술 문서_1](https://bluesharehub.com/wp-content/uploads/2022/03/img_2-30.png)
![ROLLUP 구문 Microsoft 기술 문서_1](https://bluesharehub.com/wp-content/uploads/2022/03/img_2-30.png)
2. 설명
※ Microsoft 기술 문서
![ROLLUP 구문 Microsoft 기술 문서_2](https://bluesharehub.com/wp-content/uploads/2022/03/img_3-26.png)
![ROLLUP 구문 Microsoft 기술 문서_2](https://bluesharehub.com/wp-content/uploads/2022/03/img_3-26.png)
3. 샘플 예제
▶ 아래 2개 구문은 동일함
GROUP BY ROLLUP (GRADE, S_ID)
GROUP BY GRADE, S_ID WITH ROLLUP
-- 2) 학년별, 수강과목별 소계/합계 구하기
SELECT GRADE AS '학년',
S_ID AS '수강과목',
SUM(SCORE) AS '총점',
AVG(SCORE) AS '평균점수',
MAX(SCORE) AS '가장높은점수',
MIN(SCORE) AS '가장낮은점수'
FROM BS_DEMO_8_4
GROUP BY ROLLUP (GRADE, S_ID) -- 학년, 수강과목
-- 아래 구문으로 사용해도 결과는 동일합니다.
--GROUP BY GRADE, S_ID WITH ROLLUP -- 학년, 수강과목
![ROLLUP 구문 사용으로 소계, 합계 구하기 에제 코드 실행 화면](https://bluesharehub.com/wp-content/uploads/2022/03/img_4-16.png)
![ROLLUP 구문 사용으로 소계, 합계 구하기 에제 코드 실행 화면](https://bluesharehub.com/wp-content/uploads/2022/03/img_4-16.png)
3. GROUPING 집계 함수 사용하기
1. 구문(Syntaxsql)
GROUPING ( <column_expression> )
2. 설명
GROUP BY 목록에 지정된 열 식이 집계되었는지 여부를 나타냅니다.
GROUPING은 집계된 경우 결과 집합에 1을 반환하고 집계되지 않은 경우 0을 반환합니다.
3. 샘플 예제
-- 3) GROUPING 집계함수 사용
SELECT GRADE AS '학년',
S_ID AS '수강과목',
SUM(SCORE) AS '총점',
AVG(SCORE) AS '평균점수',
MAX(SCORE) AS '가장높은점수',
MIN(SCORE) AS '가장낮은점수',
GROUPING(S_ID) AS '수강과목_그룹핑',
GROUPING(GRADE) AS '학년_그룹핑'
FROM BS_DEMO_8_4
GROUP BY ROLLUP (GRADE, S_ID)
![GROUPING 집계 함수 사용하기 예제 코드 실행 화면](https://bluesharehub.com/wp-content/uploads/2022/03/img_5-9.png)
![GROUPING 집계 함수 사용하기 예제 코드 실행 화면](https://bluesharehub.com/wp-content/uploads/2022/03/img_5-9.png)
4. 소계/합계 문구 변경
-- 4) 소계/합계 문구 변경
SELECT (CASE WHEN GROUPING(GRADE) = 1 THEN 0 ELSE GRADE END) AS '학년',
(CASE WHEN GROUPING(GRADE) = 1 THEN '합계'
ELSE (CASE WHEN GROUPING(S_ID) = 1 THEN '소계' ELSE S_ID END)
END) AS '수강과목',
SUM(SCORE) AS '총점',
AVG(SCORE) AS '평균점수',
MAX(SCORE) AS '가장높은점수',
MIN(SCORE) AS '가장낮은점수'
FROM BS_DEMO_8_4
GROUP BY ROLLUP (GRADE, S_ID)
![소계/합계 문구 변경 예제 코드 실행 결과 화면](https://bluesharehub.com/wp-content/uploads/2022/03/img_6-4.png)
![소계/합계 문구 변경 예제 코드 실행 결과 화면](https://bluesharehub.com/wp-content/uploads/2022/03/img_6-4.png)
이 글이 도움이 되셨다면 공유를 부탁 드립니다. 다음 글에서 뵙겠습니다!