MSSQL ROLLUP, GROUPING 사용법 - 소계, 합계 구하기

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 구문 사용으로 소계, 합계 구하기 에제 코드 실행 결과

2. ROLLUP 구문 사용으로 소계, 합계 구하기

1. 구문(Syntaxsql)

※ Microsoft 기술 문서

ROLLUP 구문 Microsoft 기술 문서_1


2. 설명

※ Microsoft 기술 문서

ROLLUP 구문 Microsoft 기술 문서_2


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 구문 사용으로 소계, 합계 구하기 에제 코드 실행 화면

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 집계 함수 사용하기 예제 코드 실행 화면

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)
소계/합계 문구 변경 예제 코드 실행 결과 화면


이 글이 도움이 되셨다면 공유를 부탁 드립니다. 다음 글에서 뵙겠습니다!

위로 스크롤