4.3 그룹함수
그룹함수 : GROUP BY절에 따른 결과에 대해서 그룹별로 연산을 수행하는 함수. 집계함수가 그룹함수의 일종이다.
이후의 그룹함수 예제에서는 아래 테이블을 사용한다.
DEPARTMENT | GRADE | SCORE |
---|---|---|
소프트웨어학과 | 1학년 | 3.7 |
소프트웨어학과 | 2학년 | 4.1 |
소프트웨어학과 | 2학년 | 2.6 |
소프트웨어학과 | 3학년 | 3.5 |
해고방지학과 | 2학년 | 3.6 |
해고방지학과 | 3학년 | 4.2 |
해고방지학과 | 4학년 | 2.9 |
해고방지학과 | 4학년 | 3.7 |
ROLLUP : GROUP BY절에 들어가는 칼럼을 대상으로 하위 그룹핑을 수행하는 함수. 그룹을 대상으로 한 소계와 전체 총계를 자동으로 추가해 준다. GROUP BY ROLLUP(A, B)의 경우, (A, B) -> (A) -> (전체)의 순서로 하위 그룹핑을 수행한다.
SELECT DEPARTMENT, GRADE, COUNT(*)
FROM STUDENT
GROUP BY ROLLUP(DEPARTMENT, GRADE)
ORDER BY DEPARTMENT, GRADE;
=> 학과, 학년 별로 그룹핑하여 그룹별 개수를 구하고, 학과별 소계, 총계를 구한다.
DEPARTMENT | GRADE | COUNT(*) |
---|---|---|
소프트웨어학과 | 1학년 | 1 |
소프트웨어학과 | 2학년 | 2 |
소프트웨어학과 | 3학년 | 1 |
소프트웨어학과 | [NULL] | 4 |
해고방지학과 | 2학년 | 1 |
해고방지학과 | 3학년 | 1 |
해고방지학과 | 4학년 | 2 |
해고방지학과 | [NULL] | 4 |
[NULL] | [NULL] | 8 |
CUBE : ROLLUP과 비슷하지만, CUBE는 조합 가능한 모든 경우로 그룹핑을 수행한다. GROUP BY CUBE(A, B)의 경우, (A, B) -> (A) -> (B) -> (전체)의 순서로 하위 그룹핑을 수행한다.
SELECT DEPARTMENT, GRADE, COUNT(*)
FROM STUDENT
GROUP BY CUBE(DEPARTMENT, GRADE)
ORDER BY DEPARTMENT, GRADE;
=> 학과, 학년별로 그룹핑하여 그룹별 개수를 구하고, 학과별 소계, 학년별 소계, 총계를 구한다.
DEPARTMENT | GRADE | COUNT(*) |
---|---|---|
소프트웨어학과 | 1학년 | 1 |
소프트웨어학과 | 2학년 | 2 |
소프트웨어학과 | 3학년 | 1 |
소프트웨어학과 | [NULL] | 4 |
해고방지학과 | 2학년 | 1 |
해고방지학과 | 3학년 | 1 |
해고방지학과 | 4학년 | 2 |
해고방지학과 | [NULL] | 4 |
[NULL] | 1학년 | 1 |
[NULL] | 2학년 | 3 |
[NULL] | 3학년 | 2 |
[NULL] | 4학년 | 2 |
[NULL] | [NULL] | 8 |
GROUPING SETS : 그룹핑할 대상을 지정하는 함수. 입력된 인자에 대해서만 소계를 구한다. 인자에 ROLLUP, CUBE 함수를 넣을 수 있으며 이 경우 함수의 결과인 소계, 총계들이 각각 별개의 인자로 지정된 결과를 반환한다.
SELECT DEPARTMENT, GRADE, COUNT(*)
FROM STUDENT
GROUP BY GROUPING SETS(DEPARTMENT, GRADE)
ORDER BY DEPARTMENT, GRADE;
=> 학과, 학년별로 그룹핑하여 그룹별 개수를 반환한다.
DEPARTMENT | GRADE | COUNT(*) |
---|---|---|
소프트웨어학과 | [NULL] | 4 |
해고방지학과 | [NULL] | 4 |
[NULL] | 1학년 | 1 |
[NULL] | 2학년 | 3 |
[NULL] | 3학년 | 2 |
[NULL] | 4학년 | 2 |
GROUPING : ROLLUP, CUBE, GROUPING SETS와 함께 사용하여 소계에 해당하는 행과 그렇지 않은 행을 구분할 수 있도록 해준다. 결과 행에는 1을 반환하며, 일반 행에는 0을 반환한다.
SELECT CASE GROUPING(DEPARTMENT)
WHEN 1 THEN ‘총계’ ELSE DEPARTMENT
END AS DEPARTMENT,
COUNT(*)
FROM STUDENT
GROUP BY ROLLUP(DEPARTMENT)
ORDER BY DEPARTMENT;
=> 학과별로 그룹핑하며 마지막 총계 행에는 DEPARTMENT값을 ‘총계’ 텍스트로 대체한다.
DEPARTMENT | COUNT(*) |
---|---|
소프트웨어학과 | 4 |
해고방지학과 | 4 |
총계 | 8 |