-> 블로그 이전

[SQLD] 2-14. 그룹함수

2021. 11. 6. 14:19Certificate`/SQLD

그룹함수 (Group Function)

- 하나의 SQL로 테이블을 1번만 읽어서 빠르게 원하는 자료 작성 가능

- 소계/합계 표시를 위한 GROUPING함수/CASE함수를 통해 쉽게 원하는 포맷의 보고서 작성 가능

  • ROLLUP 함수 : 집계 함수를 제외하고, 소그룹 간의 소계 계산
  • CUBE 함수 : GROUP BY 항목들 간 다차원적인 소계 계산
  • GROUPING SETS 함수 : 특정 항목에 대한 소계 계산

 

ROLLUP 함수

- 집계 함수를 제외하고, 소그룹 간의 소계 계산

- 병렬로 수행이 가능하기 때문에 매우 효과적

- 시간/지역처럼 계층적 분류를 포함하고 있는 데이터의 집계에 적합

- GROUP BY절과 같이 사용 

- ROLLUP 인수 순서가 바뀌면 결과도 바뀐다 / 소계와 합계를 순서에 맞게 반환

- ROLLUP에 지정된 그룹핑 컬럼의 list는 Subtotal을 생성하기 위해 사용

  -> 그룹핑 컬럼 수 = N -> N+1 레벨의 Subtotal 생성 (각 그룹핑 간의 합계 Subtotal)

 

※ ROLLUP의 원리

- 괄호로 묶으면 하나의 컬럼으로 간주하고, 괄호 내 각 컬럼별 집계를 구하지 않는다 

 

※ 부서명, 업무명을 기준으로 사원수와 급여 합을 집계

ROLLUP(D.DNAME, E.JOB) / D.DNAME, ROLLUP(E.JOB) / ROLLUP((D.DNAME, E.JOB)) / ROLLUP(E.JOB, D.DNAME)

 

CUBE 함수

- GROUP BY 항목들 간 다차원적인 소계 계산

- 결합 가능한 모든 값에 대하여 집계 생성

  • 장점 : 다양한 데이터를 얻는다
  • 단점 : 시스템에 부하를 많이 준다

- 내부적으로 그룹핑 컬럼의 순서를 바꿔서 또 1번의 Query를 추가 수행 / 시스템의 연산 대상이 많다

- 그룹핑 컬럼 수 = N -> 2^N승 레벨의 Subtotal 생성

- CUBE 인수의 순서가 바뀌어도 결과는 같다 / 계산 가능한 모든 소계와 합계 반환

 

※ 부서명, 업무명을 기준으로 사원수와 급여 합을 집계

CUBE(D.DNAME, E.JOB) / CUBE(E.JOB, D.DNAME)

 

GROUPING SETS 함수

- 지정한 인수들에 대한 개별 집계

- 인수 순서가 바뀌어도 결과는 같다 

- 여러 그룹핑 쿼리를 UNION ALL한 결과와 같다

 

GROUPING / GROUPING_ID 함수

- 소계로 집계되어 출력된 행을 구분

 

≫ GROUPING 함수

- 매개변수가 1개만 존재

- 해당 컬럼 값이 NULL이면 1, 아니면 0 리턴

- GROUPING 함수에서 사용될 컬럼은 반드시 GROUP BY 절에 명시 

- GROUPING SETS를 사용해서 생긴 NULL 컬럼만 구별

- 실제데이터의 NULL은 0 리턴 / 소계 산출로 생성된 행의 NULL은 1 리턴

 

≫ GROUPING_ID 함수

- 여러개의 매개변수 입력 가능

- 2진수 계산을 통해서 결과 리턴

- 실제데이터의 NULL은 0 리턴 / 소계 산출로 생성된 행의 NULL은 1 리턴

 

※ Example

※ 01→0001(2진수)→1(10진수)

※ 11→0011(2진수)→3(10진수)

※ 001→0001(2진수)→1(10진수)

※ 011→0011(2진수)→3(10진수)

※ 111→0111(2진수)→7(10진수)