반응형
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 '내용', 1 AS '개수', 400 AS '금액' UNION ALL SELECT '음식', '김밥', 1, 2000 UNION ALL SELECT '음식', '제육덮밥', 1, 4800 UNION ALL SELECT '학용품', '지우개', 3, 1200 UNION ALL SELECT '학용품', '샤프', 2, 800 UNION ALL SELECT '기타', '게임', 1, 100 ) 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 |
A | GROUP BY | GROUP BY + ROLLUP | |||||||||
분류 | 내용 | 개수 | 금액 | 분류 | 개수 | 금액 | 분류 | 개수 | 금액 | ||
학용품 | 연필 | 1 | 400 | 기타 | 1 | 100 | 기타 | 1 | 100 | ||
음식 | 김밥 | 1 | 2000 | 음식 | 2 | 6800 | 음식 | 2 | 6800 | ||
음식 | 제육덮밥 | 1 | 4800 | 학용품 | 6 | 2400 | 학용품 | 6 | 2400 | ||
학용품 | 지우개 | 3 | 1200 | NULL | 9 | 9300 | |||||
학용품 | 샤프 | 2 | 800 | ||||||||
기타 | 게임 | 1 | 100 |
GROUP BY을 사용하면, 분류컬럼을 기준으로 그룹으로 묶어 개수와 금액의 합계를 구할 수 있다.
ROLLUP을 추가해주면, GROUP BY로 묶어준 그룹의 합계들에 대한 총 합계까지 구할 수 있다.
예제2)
1 2 3 4 5 6 7 8 9 10 11 | WITH A AS ( SELECT '학용품' AS '분류', '연필' AS '내용', 1 AS '개수', 400 AS '금액' UNION ALL SELECT '음식', '김밥', 1, 2000 UNION ALL SELECT '음식', '제육덮밥', 1, 4800 UNION ALL SELECT '음식', '제육덮밥', 2, 9600 UNION ALL SELECT '학용품', '지우개', 3, 1200 UNION ALL SELECT '학용품', '샤프', 2, 800 UNION ALL SELECT '기타', '게임', 1, 100 ) 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 |
A | GROUP BY | GROUP BY + ROLLUP | |||||||||||
분류 | 내용 | 개수 | 금액 | 분류 | 내용 | 개수 | 금액 | 분류 | 내용 | 개수 | 금액 | ||
학용품 | 연필 | 1 | 400 | 기타 | 게임 | 1 | 100 | 기타 | 게임 | 1 | 100 | ||
음식 | 김밥 | 1 | 2000 | 음식 | 김밥 | 1 | 2000 | 기타 | NULL | 1 | 100 | ||
음식 | 제육덮밥 | 1 | 4800 | 학용품 | 샤프 | 2 | 800 | 음식 | 김밥 | 1 | 2000 | ||
음식 | 제육덮밥 | 2 | 9600 | 학용품 | 연필 | 1 | 400 | 음식 | 제육덮밥 | 3 | 14400 | ||
학용품 | 지우개 | 3 | 1200 | 음식 | 제육덮밥 | 3 | 14400 | 음식 | NULL | 4 | 16400 | ||
학용품 | 샤프 | 2 | 800 | 학용품 | 지우개 | 3 | 1200 | 학용품 | 샤프 | 2 | 800 | ||
기타 | 게임 | 1 | 100 | 학용품 | 연필 | 1 | 400 | ||||||
학용품 | 지우개 | 3 | 1200 | ||||||||||
학용품 | NULL | 6 | 2400 | ||||||||||
NULL | NULL | 11 | 18900 |
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 |
A | GROUP BY | GROUP BY + ROLLUP | |||||||||||
분류 | 내용 | 개수 | 금액 | 분류 | 내용 | 개수 | 금액 | 분류 | 내용 | 개수 | 금액 | ||
학용품 | 연필 | 1 | 400 | 기타 | 게임 | 1 | 100 | 기타 | 게임 | 1 | 100 | ||
음식 | 김밥 | 1 | 2000 | 음식 | 김밥 | 1 | 2000 | 기타 | 게임 | NULL | 100 | ||
음식 | 제육덮밥 | 1 | 4800 | 음식 | 제육덮밥 | 1 | 4800 | 기타 | NULL | NULL | 100 | ||
음식 | 제육덮밥 | 2 | 9600 | 음식 | 제육덮밥 | 2 | 9600 | 음식 | 김밥 | 1 | 2000 | ||
학용품 | 지우개 | 3 | 1200 | 학용품 | 지우개 | 3 | 1200 | 음식 | 김밥 | NULL | 2000 | ||
학용품 | 샤프 | 2 | 800 | 학용품 | 샤프 | 2 | 800 | 음식 | 제육덮밥 | 1 | 4800 | ||
기타 | 게임 | 1 | 100 | 학용품 | 연필 | 1 | 400 | 음식 | 제육덮밥 | 2 | 9600 | ||
음식 | 제육덮밥 | NULL | 14400 | ||||||||||
음식 | NULL | NULL | 16400 | ||||||||||
학용품 | 샤프 | 2 | 800 | ||||||||||
학용품 | 샤프 | NULL | 800 | ||||||||||
학용품 | 연필 | 1 | 400 | ||||||||||
학용품 | 연필 | NULL | 400 | ||||||||||
학용품 | 지우개 | 3 | 1200 | ||||||||||
학용품 | 지우개 | NULL | 1200 | ||||||||||
학용품 | NULL | NULL | 2400 | ||||||||||
NULL | NULL | NULL | 18900 |
GROUP BY을 사용해도 분류, 내용, 개수로 묶이는 그룹이 없기 때문에 테이블A와 결과가 동일하다.
하지만, ROLLUP을 추가해주면
GROUP BY의 첫번째와 두번째에 해당하는 분류컬럼과 내용컬럼의 값이 같은 그룹 값들의 소계,
첫번째에 해당하는 분류컬럼의 값과 같은 그룹 값들의 소계2,
그 소계들의 합에 해당하는 총합계를 구할 수 있다.
반응형
'프로그래밍 > MSSQL' 카테고리의 다른 글
[MSSQL] 조건절 LIKE 검색 조건 (ESCAPE 특수문자 와일드 카드 (예약어) 검색) (0) | 2017.02.13 |
---|---|
[MSSQL] PIVOT, UNPIVOT (행렬 변환) (6) | 2017.02.10 |
[MSSQL] DATENAME, DATEPART (요일, 올해 몇번째 날, 주말을 제외한 평일 일수) (0) | 2017.02.09 |
[MSSQL] PARTITION BY 테이블 분할 함수 (0) | 2017.02.09 |
[MSSQL] COMPUTE (별도의 결과 집합으로 출력) (0) | 2016.07.11 |