2.2.5 그룹 함수

YJ·2022년 8월 30일
0

2.2.5 그룹 함수

데이터 분석 개요

  1. AGGREGATE FUNCTION
    1. COUNT, SUM, AVG, MAX
  2. GROUP FUNCTION
    1. ROLLUP: 집계함수를 제외하고 소그룹 간의 소계를 계산
    2. CUBE: GROUP BY 항목 간 다차원적인 소계를 계산
    3. GROUPING SETS: 특정 항목에 대한 소계를 계산
  3. WINDOW FUNCTION

GROUPING SETS 함수

  • 순서 상 GROUPING SETS가 먼저 오는 게 맞을 것 같음.
  • GROUPING SETS: 특정 항목에 대한 소계를 계산
  • 원하는 부분의 소계 집합을 만들 수 있음
  • 계층 구조인 ROLLUP과는 달리 평등한 관계이므로 인수의 순서가 바뀌어도 결과는 같음.

일반 그룹함수를 이용한 SQL

SELECT DNAME, 'All Jobs' JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME
UNION ALL
SELECT 'All Departments' DNAME, JOB, COUNT(*) "Total Empl",
	   SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY JOB;

GROUPING SETS 사용 SQL (오라클)

SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME) AS DNAME,
      DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
      COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS(DNAME, JOB);
  • 위 일반 그룹함수에 있던 SELECT 절 두 개를 각각 GROUPING한듯

ROLLUP 함수

  • ROLLUP: 집계함수를 제외하고 소그룹 간의 소계를 계산
  • 병렬로 수행이 가능하여 매우 효과적
  • 그룹핑 컬럼 수(N) + 1 = 소계(N + 1개)
  • ROLLUP의 인수는 계층구조이므로 인수 순서가 바뀌면 수행결과도 바뀜

일반적인 GROUP BY 절  + ORDER BY 절

SELECT DNAME, JOB
	COUNT(*) "Total Empl",
    SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB
ORDER BY DNAME, JOB;

ROLLUP 함수 + ORDER BY 절

SELECT DNAME, JOB
   COUNT(*) "Total Empl",
   SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB)
ORDER BY DNAME, JOB;
  • DNAME,JOB으로 묶음

GROUPING 함수

SELECT DNAME,     GROUPING(DNAME),
      JOB,        GROUPING(JOB),
      COUNT(*) "Total Empl",
      SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);
  • ROLLUP이나 CUBE에 의해 소계가 계산된 결과에는 GROUPING(EXPR) = 1
  • 그 외의 결과 GROUPING(EXPR) = 0

GROUPING 함수 + CASE 사용

SELECT 
   CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
   CASE GROUPING(JOB)    WHEN 1 THEN 'All jobs'          ELSE JOB END AS JOB,
      COUNT(*) "Total Empl",
      SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);

CUBE 함수

  • 소계만 생성한 ROLLUP과는 달리 CUBE는 결합 가능한 모든 값에 대해 다차원 집계를 생성
  • 계층구조인 ROLLUP과는 달리, 평등한 관계이므로 인수의 순서가 바뀌어도 정렬은 다를 수 있으나 데이터의 결과는 같음.
  • 2의 N승 레벨의 소계 생성
SELECT 
   CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
   CASE GROUPING(JOB)    WHEN 1 THEN 'All jobs'          ELSE JOB END AS JOB,
   COUNT(*) "Total Empl",
   SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE (DNAME, JOB);
profile
💻귀찮으니 필요할 때만 쓰는 Computer Vision 일지 ㅇㅇ💻

0개의 댓글