집계 함수 (2) – 고급 집계 함수
1. GROUPING SET 절
1-0. 학습 준비 (데이터 생성)
1 | CREATE TABLE SALES |
1 | SELECT * FROM SALES; |
1-1. GROUP BY 절 활용
(1) 2개 컬럼 GROUP BY 절
[MISSION 1] BRAND별, SEGMENT별 총 판패량 구하기
1 | SELECT |
(2) 1개 컬럼 GROUP BY 절
[MISSION 2] BRAND별 총 판매량 구하기
1 | SELECT |
[MISSION 3] SEGMENT별 총 판매량 구하기
1 | SELECT |
(3) GROUP BY 안하기
[MISSION 4] 판매량 전체 합계 구하기
1 | SELECT |
(4) 추출된 정보 합치기 – UNION ALL의 활용
1 | SELECT -- BRAND별, SEGMENT별 총 판패량 |
[주의] 각각의 UNION query는 같은 수의 columns를 가져야 한다. 따라서 각 부분의 SELECT 절에서 컬럼수가 부족하면 NULL로 채워야 함.
이 방법의 단점:
- 동일한 테이블을 4번씩이나 읽고 있다. --> 성능 저하 가능성이 존재
- SQL 문이 너무 길어진다. --> 복잡하다 --> 유지보수가 용이하지 않다
>> 이런 불편함을 줄이기 위해서 GROUPING SET 절을 활용한다.
1-2. GROUPING SET 절 활용
1-2-1. 용도
GROUPING SET 절을 사용하여 여러 개의 UNION ALL을 이용한 SQL과 같은 결과를 도출할 수 있다.
1-2-2. GROUPING SET 절 문법
GROUPING SET 절을 이용하면 한번에 다양한 기준의 컬럼 조합으로 집계를 구할 수 있다.
1 | SELECT |
1-2-3. GROUPING SET 절 실습
>> GROUPING SET 절의 활용
GROUPING SET 절을 이용하여 BRAND, SEGMENT 기준, BRAND 기준, SEGMENT 기준, 전체기준으로 QUANTITY 합계의 값을 구할 수 있다.
1 | SELECT * FROM SALES; |
1 | SELECT |
>> GROUPING 함수의 활용
GROUPING 함수를 이용하여 해당 컬럼이 GROUPING 시 사용되었으면 0, 그렇지 않으면 1을 리턴한다.
1 | SELECT * FROM SALES; |
1 | SELECT |
1 | SELECT |
2. ROLL UP 절
2-1. 용도
지정된 GROUPING 컬럼의 소계를 생성하는데 사용된다. 간단한 문법으로 다양한 소계를 출력할 수 있다.
2-2. ROLLUP 절 문법
-
ROLLUP 절은 GROUP BY 절과 함계 사용된다.
-
ROLLUP 할 컬럼은 무조건 SELECT 절에 포함되어 있어야 한다.
-
ROLLUP 절 컬럼의 지정 순서가 의미 있다.
(1) 전체 ROLL UP
- 컬럼의 지정 순서가 의미 있음
1 | -- 전체 ROLL UP |
(2) 부분 ROLL UP
-
특정 컬럼만 분리하여 ROLL UP 할 수 있다
-
이런 경우에 분리된 특정 컬럼(C1)으로 시작하는 GROUPING SET 만 해당
-
즉, 전체 ROLL UP과 달리, GROUPING 하지 않는 전체 합계를 구하지 않는다.
1 | -- 부분 ROLL UP |
2-3. ROLLUP 절 실습
1 | SELECT * FROM SALES; |
(1) GROUP BY만 사용 (ROLL UP 안함)
1 | -- BRAND, SEGMENT 컬럼 기준으로 GROUP BY 한다. |
(2) GROUP BY + 전체 ROLL UP
1 | -- BRAND, SEGMENT 컬럼 기준으로 ROLL UP 한다. |
- 전체 컬럼 ROLLUP 결과:
- BRAND + SEGMENT 별 합계 --> GROUP BY (BRAND, SEGMENT) 결과
- BRAND 별 합계 (소계) --> GROUP BY + ROLL UP 절의 첫번째 컬럼
- 전체 합계 (총계)
(3) GROUP BY + 부분 ROLL UP
1 | -- SEGMENT 컬럼 기준으로 GROUP BY 한다 + BRAND 컬럼 기준으로 부분 ROLL UP 한다 |
- 부분 컬럼 ROLLUP 결과:
- SEGMENT, BRAND 별 합계 --> GROUP BY (SEGMENT, BRAND) 결과
- SEGMENT 별 합계 (소계) --> ROLLUP 절에서 제외된 특정 컬럼
**>> **전체 합계 (총계)를 구하지 않는다
3. CUBE 절
3-1. 용도
지정된 GROUPING 컬럼의 다차원 소계를 생성하는데 사용된다. 간단한 문법으로 다차원 소계를 출력할 수 있다.
3-2. CUBE 절 문법
-
CUBE절은 GROUP BY 절과 함계 사용된다.
-
CUBE 할 컬럼은 무조건 SELECT 절에 포함되어 있어야 한다.
-
CUBE절 컬럼의 지정 순서가 의미 없다
(1) 전체 컬럼 CUBE 지정
- 컬럼의 지정 순서가 의미 없음
- 지정한 그룹의 모든 경우의 수 에 대한 소계와 총계를 구한다
1 | SELECT |
CUBE 절 내 인자의 개수가 N개이면 2의 N승의 소계가 발생하게 된다.
CUBE (C1, C2, C3)를 GROUPING SETS으로 표현하면 총 9개의 소계가 발생한다.
(2) 부분 컬럼 CUBE 지정
-
특정 컬럼만 분리하여 CUBE 를 지정할 수 있다
-
이런 경우에 분리된 특정 컬럼(C1)으로 시작하는 GROUPING SET 만 해당
1 | SELECT |
3-3. CUBE 절 실습
1 | SELECT * FROM SALES; |
(1) 전체 컬럼 CUBE 지정
1 | -- BRAND, SEGMENT 컬럼 기준으로 CUBE 한다. |
- 전체 컬럼 CUBE 결과:
- BRAND + SEGMENT 별 합계 --> GROUP BY (BRAND, SEGMENT) 결과
- BRAND 별 합계 (소계)
- SEGMENT 별 합계 (소계)
- 전체 합계 (총계)
>> 인자가 2개 이므로 총 4개의 경우의 수가 합계로 출력된다
(2) 부분 컬럼 CUBE 지정
1 | -- BRAND 컬럼 기준으로 GROUP BY 한다 + SEGMENT 컬럼 기준으로 부분 CUBE 한다 |
-
부분 컬럼 CUBE 결과:
-
BRAND + SEGMENT 별 합계 --> GROUP BY (BRAND, SEGMENT) 결과
-
BRAND 별 합계 (소계) --> CUBE 절에서 제외된 특정 컬럼
>> SEGMENT 별 합계 (소계)를 구하지 않는다.
**>> ** 전체 합계 (총계)를 구하지 않는다.
-