[SQL] 그룹함수
Oracle의 그룹함수를 알아보자. 그룹함수는 데이터를 GROUP BY 하여 나타낼 수 있는 데이터를 구하는 함수이다. 집계 함수와 소계(총계) 함수로 나눌 수 있다. 소계 관련 함수로는 ROLLUP, CUBE, GROUPING SETS, GROUPING 등이 있다.
Aug 13, 2024
Oracle의 그룹함수를 알아보자. 그룹함수는 데이터를
GROUP BY
하여 나타낼 수 있는 데이터를 구하는 함수이다. 집계 함수와 소계(총계) 함수로 나눌 수 있다. 소계 관련 함수로는 ROLLUP
, CUBE
, GROUPING SETS
, GROUPING
등이 있다.✅ 1. 그룹 함수
집계 함수 | COUNT , SUM , AVG , MAX , MIN 등 |
소계(총계) 함수 | ROLLUP , CUBE , GROUPING SETS 등
- ROLLUP 함수는 인수의 순서에 따라 결과가 달라지지만, CUBE 나 GROUPING SETS 함수는 인수의 순서가 바뀌어도 같은 결과를 출력한다. |
✅ 2. 집계 함수
데이터를 그룹화하면, 그룹화된 각 그룹을 집계하는 여러 함수를 사용할 수 있다.
함수 | 의미 |
COUNT(*) | 전체 행의 개수를 반환 |
COUNT(col) | col 값이 NULL이 아닌 개수를 반환 |
COUNT(DISTINCT col) | col 값이 NULL이 아닌 데이터 중, 중복을 제거한 개수를 반환 |
SUM(col) | NULL이 아닌 col의 총합을 반환 |
AVG(col) | NULL이 아닌 col의 평균을 반환 |
MIN(col) | NULL이 아닌 col의 최솟값을 반환 |
MAX(col) | NULL이 아닌 col의 최댓값을 반환 |
✅ 3. ROLLUP
소그룹 간 소계 및 총계를 계산하는 함수이다. 그룹 별로 함수를 계산한 값과, 총 그룹들에 함수를 계산한 값을 모두 출력해준다.
ROLLUP(A) | - A로 그룹화
- 총합계 |
ROLLUP(A, B) | - A, B로 그룹화
- A로 그룹화
- 총합계 |
ROLLUP(A, B, C) | - A, B, C로 그룹화
- A, B로 그룹화
- A로 그룹화
- 총합계 |
그룹화할 컬럼이 1개일 때
그룹화할 컬럼이 2개일 때
그룹화할 컬럼이 3개일 때
✅ 4. CUBE
소그룹 간의 소계 및 총계를 다차원적으로 계산할 수 있는 함수이다. GROUP BY가 일방향으로 그룹화하여 소계를 구했다면, CUBE는 조합할 수 있는 모든 그룹에 대한 소계를 집계한다.
ROLLUP(A) | - A로 그룹화
- 총합계 |
ROLLUP(A, B) | - A, B로 그룹화
- A로 그룹화
- B로 그룹화
- 총합계 |
ROLLUP(A, B, C) | - A, B, C로 그룹화
- A, B로 그룹화
- A, C로 그룹화
- B, C로 그룹화
- A로 그룹화
- B로 그룹화
- C로 그룹화
- 총합계 |
그룹화할 컬럼이 1개일 때
그룹화할 컬럼이 2개일 때
그룹화할 컬럼이 3개일 때 (아래 더 있음)
✅ 5. GROUPING SETS
특정 항목에 대한 소계를 계산하는 함수이다. 인자값으로
ROLLUP
이나 CUBE
를 사용할 수 있다.GROUPING SETS(A, B) | - A로 그룹화
- B로 그룹화 |
GROUPING SETS(A, B, ( )) | - A로 그룹화
- B로 그룹화
- 총합계 |
GROUPING SETS(A, ROLLUP(B)) | - A로 그룹화
- B로 그룹화
- 총합계 |
GROUPING SETS(A, ROLLUP(B, C)) | - A로 그룹화
- B, C로 그룹화
- B로 그룹화
- 총합계 |
GROUPING SETS(A, B, ROLLUP(C)) | - A로 그룹화
- B로 그룹화
- C로 그룹화
- 총합계 |
✅ 6. GROUPING
GROUPING
함수는 ROLLUP
, CUBE
, GROUPING SETS
등과 함께 쓰이며 소계를 나타내는 ROW를 구분할 수 있게 해준다. 원래 ROW에서 그룹핑의 기준이 되는 컬럼을 제외하고 모두 NULL 값으로 표현되었지만, GROUPING 함수를 이용하면 원하는 위치에 원하는 텍스트를 출력할 수 있다.GROUPING()
함수를 사용하면, 그룹화한 컬럼값으로 1을 리턴한다. 저 1을 가지고 아래처럼 특정 값을 넣을 수 있다.
GROUPING(deptno)
의 값이 1이면 0을 넣고, 아니라면 원래의deptno
값을 넣도록 설정하여 원래NULL
이었던deptno
값을 채울 수 있다! 단, 넣을 수 있는 값은 원래 컬럼의 데이터 타입과 일치해야 한다.
Share article