본문 바로가기

프로그래밍/MSSQL

[MSSQL] ROLLUP (소계, 합계)

반응형




ROLLUP


GROUP BY에 있는 컬럼들을 오른쪽에서 왼쪽순으로 그룹으로 묶어서 각 그룹에 계를 구한다.


※ 정리

GROUP BY a,b,c,d 라고 가정하면


a, b, c, d 로 묶이는 그룹의 

a, b, c 로 묶이는 그룹의 소계

a, b 로 묶이는 그룹의 소계

a 로 묶이는 그룹의 소계

위의 소계들의 총 합계 (전체합계)


결과가 이렇게 보여진다.



예제)


1
2
3
4
5
6
7
8
9
10
WITH A AS
(
    SELECT '학용품' AS '분류''연필' AS '내용'AS '개수'400 AS '금액'
    UNION ALL SELECT '음식''김밥'12000
    UNION ALL SELECT '음식''제육덮밥'14800
    UNION ALL SELECT '학용품''지우개',  31200
    UNION ALL SELECT '학용품''샤프',  2800
    UNION ALL SELECT '기타''게임',  1100
)
SELECT * FROM A
cs


1
2
3
SELECT 분류, SUM(개수) AS '개수', SUM(금액) AS '금액'
FROM A
GROUP BY 분류
cs

 

1
2
3
4
SELECT 분류, SUM(개수) AS '개수', SUM(금액) AS '금액'
FROM A
GROUP BY 분류
WITH ROLLUP
cs


 

AGROUP BYGROUP BY + ROLLUP
분류내용개수금액분류개수금액분류개수금액
학용품연필1400기타1100기타1100
음식김밥12000음식26800음식26800
음식제육덮밥14800학용품62400학용품62400
학용품지우개31200NULL99300
학용품샤프2800
기타게임1100

 



GROUP BY을 사용하면, 분류컬럼을 기준으로 그룹으로 묶어 개수와 금액의 합계를 구할 수 있다.


ROLLUP을 추가해주면, GROUP BY로 묶어준 그룹의 합계들에 대한 총 합계까지 구할 수 있다.




예제2)


1
2
3
4
5
6
7
8
9
10
11
WITH A AS
(
    SELECT '학용품' AS '분류''연필' AS '내용'AS '개수'400 AS '금액'
    UNION ALL SELECT '음식''김밥'12000
    UNION ALL SELECT '음식''제육덮밥'14800
    UNION ALL SELECT '음식''제육덮밥'29600
    UNION ALL SELECT '학용품''지우개',  31200
    UNION ALL SELECT '학용품''샤프',  2800
    UNION ALL SELECT '기타''게임',  1100
)
SELECT * FROM A
cs

  

1
2
3
SELECT 분류, 내용, SUM(개수) AS '개수', SUM(금액) AS '금액'
FROM A
GROUP BY 분류, 내용
cs


1
2
3
4
SELECT 분류, 내용, SUM(개수) AS '개수', SUM(금액) AS '금액'
FROM A
GROUP BY 분류, 내용
WITH ROLLUP
cs

 

AGROUP BYGROUP BY + ROLLUP
분류내용개수금액분류내용개수금액분류내용개수금액
학용품연필1400기타게임1100기타게임1100
음식김밥12000음식김밥12000기타NULL1100
음식제육덮밥14800학용품샤프2800음식김밥12000
음식제육덮밥29600학용품연필1400음식제육덮밥314400
학용품지우개31200음식제육덮밥314400음식NULL416400
학용품샤프2800학용품지우개31200학용품샤프2800
기타게임1100학용품연필1400
학용품지우개31200
학용품NULL62400
NULLNULL1118900



GROUP BY을 사용하면, 분류컬럼과 내용컬럼을 기준으로 그룹으로 묶어 개수와 금액의 합계를 구할 수 있다.


ROLLUP을 추가해주면 GROUP BY의 첫번째에 해당하는 분류컬럼 그룹 값들의 소계,

그 소계들의 합에 해당하는 총합계를 구할 수 있다.




예제3)


GROUP BY로 개수까지 묶어서 그룹을 만들어 준다면??


1
2
3
SELECT 분류, 내용, 개수, SUM(금액) AS '금액'
FROM A
GROUP BY 분류, 내용, 개수
cs

 

1
2
3
4
SELECT 분류, 내용, 개수, SUM(금액) AS '금액'
FROM A
GROUP BY 분류, 내용, 개수
WITH ROLLUP
cs

 

AGROUP BYGROUP BY + ROLLUP
분류내용개수금액분류내용개수금액분류내용개수금액
학용품연필1400기타게임1100기타게임1100
음식김밥12000음식김밥12000기타게임NULL100
음식제육덮밥14800음식제육덮밥14800기타NULLNULL100
음식제육덮밥29600음식제육덮밥29600음식김밥12000
학용품지우개31200학용품지우개31200음식김밥NULL2000
학용품샤프2800학용품샤프2800음식제육덮밥14800
기타게임1100학용품연필1400음식제육덮밥29600
음식제육덮밥NULL14400
음식NULLNULL16400
학용품샤프2800
학용품샤프NULL800
학용품연필1400
학용품연필NULL400
학용품지우개31200
학용품지우개NULL1200
학용품NULLNULL2400
NULLNULLNULL18900



GROUP BY을 사용해도 분류, 내용, 개수로 묶이는 그룹이 없기 때문에 테이블A와 결과가 동일하다.


하지만, ROLLUP을 추가해주면

GROUP BY의 첫번째와 두번째에 해당하는 분류컬럼과 내용컬럼의 값이 같은 그룹 값들의 소계,

첫번째에 해당하는 분류컬럼의 값과 같은 그룹 값들의 소계2,

그 소계들의 합에 해당하는 총합계를 구할 수 있다.

반응형