[DB] ROLLUP, CUBE, GROUPING SETS
사용할 테이블
여기서는 mySQL을 사용했다
아래 글을 읽어보면 아시겠지만 mySQL은 지원하지 않는 그룹핑 함수가 있어서 추가 작업이 필요하다
GROUP BY
1
2
3
SELECT 학년, 반, AVG(점수) AS 점수
FROM 점수
GROUP BY 학년, 반;
그냥 GROUP BY를 할 경우, 학년과 반에 따른 점수 평균이 나온다
ROLLUP
1
2
3
4
5
SELECT 학년, 반, AVG(점수) AS 점수
FROM 점수
GROUP BY 학년, 반 WITH ROLLUP;
-- 위의 예제는 mySQL에서 사용방법이다
-- 다른 SQL : GROUP BY ROLLUP(학년, 반);
ROLLUP을 사용하면 학년의 평균, 총 평균이 추가된다
CUBE
1
2
3
4
5
6
7
8
9
10
SELECT 학년, 반, AVG(점수) AS 점수
FROM 점수
GROUP BY 학년, 반 WITH ROLLUP
UNION
SELECT 학년, 반, AVG(점수) AS 점수
FROM 점수
GROUP BY 반, 학년 WITH ROLLUP;
-- mySQL은 cube를 지원하지 않기 때문에 ROLLUP을 UNION 시키면
-- 순서는 다르지만 같은 결과를 볼 수 있다.
-- 다른 SQL : GROUP BY CUBE(학년, 반);
CUBE을 사용하면 학년의 평균, 총 평균 그리고 학년이 상관없는 반별 평균이 추가된다
GROUPING SETS
mysql
1
2
3
4
5
6
7
8
9
10
11
SELECT 학년, 반, AVG(점수) AS 점수
FROM 점수
GROUP BY 학년, 반 WITH ROLLUP
HAVING 학년 IS NULL XOR 반 IS NULL
UNION
SELECT 학년, 반, AVG(점수) AS 점수
FROM 점수
GROUP BY 반, 학년 WITH ROLLUP
HAVING 학년 IS NULL XOR 반 IS NULL;
-- mySQL은 GROUPING SETS도 지원하지 않아 추가 작업이 필요하다
-- 다른 SQL : GROUP BY GROUPING SETS (학년, 반)
GROUPING SETS()
를 위처럼 사용하면 총계를 포함하지 않고 괄호 안에 포함된 열의 부분 집계만을 나타낸다.
사용 예
1
2
3
4
5
6
7
8
SELECT column1, column2, aggregate_function(column3)
FROM your_table
GROUP BY GROUPING SETS (
(column1), -- 그룹화 조합 1
(column2), -- 그룹화 조합 2
(column1, column2), -- 그룹화 조합 3
() -- 전체 집계 (그룹 없음)
);
이처럼 사용하고 싶은 부분 집계, 전체 집계를 사용할 수 있다
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.