업무 중 현황이나 결과를 한눈에 보여줘야 하는 경우가 많습니다.
이전에 작성한 글 에서는 UNION, UNION ALL 으로 병합을 했다면, 이번 글에서는 그룹함수를 이용하여 테이블을 한번만 읽어 빠르게 원하는 결과를 도출해 낼 수 있습니다.
(제가 시험쳤던 2022년 3월 12일 시험에서 소계를 계산할 때 사용하는 함수 문제가 출제되었습니다.)
2022.02.07 - [database] - [SQL] UNION / UNION ALL, WITH
그룹함수의 종류
그룹함수의 종류에는 ROLLUP, CUBE, GROUPING SETS가 있습니다.
세 함수 모두 GROUP BY (ROLLUP/CUBE/GROUPING SETS)(속성명) 으로 표현합니다.
1. ROLLUP : 소그룹 간의 소계를 계산
2. CUBE : GROUP BY 항목들간 다차원적인 소계를 계산할 수 있음 (모든 그룹케이스를 계산)
3. GROUPING SETS : 특정 항목체 대한 소계를 계산할 수 있음 ( GROUPING SETS는 특정항목을 그룹한 다수의 SQL들을 UNION 한 것과 같음)
ROLLUP
ROLLUP에 의해서 생성되는 소계는 그룹핑 되는 컬럼의 수를 N개라고 했을 때, N+1 레벨의 소계가 생성됩니다.
SELECT ID, YYYYMM, SUM(PRICE) AS PRICE
FROM TABLE
GROUP BY ROLLUP(ID, YYYYMM)
위의 SQL 문을 실행해보면 ID 별 월별 가격소계가 나오게 되는데, 추가로 ID별 가격소계가 나오며, 마지막에 전체 소계가 나오게 됩니다.
id1 | 202202 | 10000 |
id1 | 202203 | 20000 |
id1 | null | 30000 |
id2 | 202203 | 40000 |
id2 | null | 40000 |
null | null | 70000 |
CUBE
CUBE 함수는 그룹핑 컬럼이 가질 수 있는 모든 경우의 수에 대하여 소계(SUBTOTAL)과 총계(GRAND TOTAL)을 생성합니다.
따라서 ROLLUP 함수와는 다르게 인자의 순서가 달라도 결과는 같습니다.
위의 ROLLUP 예제와 다르게 CUBD는 월별 소계도 생성되었으며, 그룹핑 컬럼이 N개라고 한다면, 2의 N승의 소계(SUBTOTAL)을 생성합니다.
SELECT ID, YYYYMM, SUM(PRICE) AS PRICE
FROM TABLE
GROUP BY CUBE(ID, YYYYMM)
null | null | 70000 |
null | 202202 | 10000 |
null | 202203 | 60000 |
id1 | 202202 | 10000 |
id1 | 202203 | 20000 |
id1 | null | 30000 |
id2 | 202203 | 40000 |
id2 | null | 40000 |
GROUPING SETS
GROUPING SETS 는 위의 ROLLUP과 CUBE와는 다르게 계층이 나타나지 않고 그룹핑된 결과값만을 보여줍니다.
GROUPING SETS 는 괄호로 묶은 집합별로의 집계 역시 구할 수 있다,
(GROUPING SETS((ID, YYYYMM), NAME))
SELECT ID, YYYYMM, SUM(PRICE) AS PRICE
FROM TABLE
GROUP BY GROUPING SETS(ID, YYYYMM)
id1 | null | 30000 |
id2 | null | 40000 |
null | 202202 | 10000 |
null | 202203 | 60000 |
https://limkydev.tistory.com/149
'database > SQLD' 카테고리의 다른 글
[SQLD] Database 에서의 NULL (0) | 2022.02.14 |
---|---|
[SQLD] 단일행 함수, 다중행 함수 (0) | 2022.02.13 |
[SQLD] 반정규화(Denormalization) (0) | 2022.02.11 |
[SQLD] 정규화(Normalization) (0) | 2022.02.11 |
[SQLD] 식별자 (0) | 2022.02.11 |
댓글