영우 글로벌 러닝 4차혁명 교육과정의 "방형욱" 강사님과 함께 공부한 내용입니다.

# Rollup

 

  - 컬럼의 개수가 n개면 n+1 가지 종류의 결과 생성

  - 컬럼의 나열 순서가 중요함

 

  select deptno, job, sum(sal)

  from emp

  group by deptno, job

 

  select deptno, job, sum(sal)

  from emp

  group by ROLLUP(deptno, job);

 

  select deptno, job, sum(sal)

  from emp

  group by GROUPING SETS((deptno, job), (deptno), ());

 

  cf. select deptno, decode(deptno, null, 'TOTAL', decode(job, null, 'DEPT_SUM', job)) as job, sum(sal)

      from emp

      group by ROLLUP(deptno, job);

 

# Cube

 

  - 컬럼의 개수가 n개면 2^n 가지 종류의 결과 생성

  - 컬럼의 나열 순서가 중요하지 않음

 

  select deptno, job, sum(sal)

  from emp

  group by CUBE(deptno, job);

 

  select deptno, job, sum(sal)

  from emp

  group by GROUPING SETS((deptno, job), (deptno), (job), ());

 

# 집계 기준 컬럼이 3개일 경우

 

  drop table emp2 purge;

 

  create table emp2

  as

  select  empno, ename, sal, job, deptno, decode(mod(empno, 2), 0, 'M', 'W') as gender

  from emp e

  union all

  select  empno, ename, sal+100, job, deptno, decode(mod(empno, 2), 0, 'W', 'M') as gender

  from emp e;

 

  select * from emp2;

 

    --

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by ROLLUP(deptno, job, gender)

  order by 1, 2, 3;

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by GROUPING SETS((deptno, job, gender), (deptno, job), (deptno), ())

  order by 1, 2, 3;

 

    --

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by CUBE(deptno, job, gender)

  order by 1, 2, 3;

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by GROUPING SETS((deptno, job, gender), (deptno, job), (deptno, gender), (job, gender), (deptno), (job), (gender), ())

  order by 1, 2, 3;

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by GROUPING SETS((deptno, job, gender), (job, gender), ())

  order by 1, 2, 3;

 

# GROUPING 함수

 

  drop table emp3 purge;

 

  create table emp3 as select * from emp;

 

  update emp3 set job = null where rownum = 1;

 

  select * from emp3;

 

  => grouping 함수를 사용하지 않을 경우 아래와 같이 질의 결과가 이상해집니다.

 

  select deptno, job, sum(sal) as sum_sal

  from emp3

  group by ROLLUP(deptno, job);

 

  select *

  from (select deptno, job, sum(sal) as sum_sal

        from emp3

        group by ROLLUP(deptno, job))

  where deptno is not null

  and job is null;

 

  => grouping 함수를 사용하면 이렇게 달라집니다.

 

  select deptno, job, sum(sal) as sum_sal,

         grouping(deptno) as g_deptno,

         grouping(job)    as g_job

  from emp3

  group by ROLLUP(deptno, job);

 

  select deptno, job, sum_sal

  from (select deptno, job, sum(sal) as sum_sal,

               grouping(deptno) as g_deptno,

               grouping(job)    as g_job

        from emp3

        group by ROLLUP(deptno, job))

  where g_deptno = 0

  and   g_job    = 1;

 

  select deptno, job, sum_sal

  from (select deptno, job, sum(sal) as sum_sal,

               grouping(deptno) as g_deptno,

               grouping(job)    as g_job

        from emp3

        group by ROLLUP(deptno, job))

  where g_deptno = 0

  and   g_job    in (0, 1);

 

# Composite column

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by deptno, job, gender;

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by rollup(deptno, job, gender);

 

    --> deptno, job, gender

    --> deptno, job

    --> deptno

    --> ()

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by rollup(deptno, (job, gender));

 

    --> deptno, job, gender

    --> deptno

    --> ()

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by rollup((deptno, job), gender);

 

    --> deptno, job, gender

    --> deptno, job

    --> ()

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by rollup((deptno, job, gender));

 

    --> deptno, job, gender

    --> ()

 

# Concatenated Groupings

  select deptno, job, gender, sum(sal)

  from emp2

  group by deptno, rollup(job), cube(gender);

 

           deptno    job         gender

                     ()          ()

 

           --> deptno, job, gender

           --> deptno, job

           --> deptno, gender

           --> deptno

 

  select deptno, job, gender, sum(sal)

  from emp2

  group by GROUPING SETS((deptno, job, gender), (deptno, job), (deptno, gender), (deptno));

 

'IT 공방 > SQL' 카테고리의 다른 글

ORA-65096 오류 해결  (0) 2019.10.07

 

1. 데이터 분석 개요

 

. AGGREGATE FUNCTION

COUNT, SUM, AVG, MAX, MIN 각종 집계 함수들 포함

 

. GROUP FUNTION

레벨별 집계를 위한 여러 단계의 SQL UNION, UNION ALL 묶은 하나의 테이블을 여러 읽어 다시 재정렬하는 단계를

그룹함수를 이용하면 한번에 해결 가능, CASE 함수를 이용하면 쉽게 원하는 포맷 보고서 작성 가능

  • ROLLUP 함수 : 소그룹 간의 소계를 계산, 확장된 형태, 병렬로 수행가능하기에 효과적임, 계층적 분류를 포함하고 있는 데이터 집계에 적합
  • CUBE 함수 : GROUP BY 항목들 다차원적인 소계를 계산, 모든값에 대한 다차원적인 집계 생성, 시스템 부하를 줄수 있음
  • GROUPING SET 함수 : 특정 항목에 대한 소계를 계산, 원하는 부분만 추출가능
  • Rollup 이나 Cube에 의한 소계가 계산된 결과에는 Grouping = 1 이 표시되고 그 외의 결과에는 Grouping = 0 으로 표시

 

. WINDOW FUNTION

분석함수, 순위함수로 불림, 데이터웨어하우스에서 발전한 기능

 

2. ROLLUP 함수


지정된 그룹 칼럼의 리스트는 SUBTOTAL 생성하기 위해 사용되어짐

생성되는 SUBTOTAL : 칼럼수 + 1

인수는 계층구조라 인수 순서가 바뀌면 수행결과 바뀌니 인수의 순서에도 주의해야함

STEP 1. 일반적인 GROUP BY 사용 + ORDER BY 사용

STEP 2. ROLLUP 함수 사용 + ORDER BY 사용

그룹 함수 수행시 생성되는 표준집계 + 기준칼럼에 대한 소계 + 전체의 마지막 소계

STEP 3. GROUPING 함수 사용 + CASE 함수 사용(ORACLE경우는 DECODE함수 사용)

GROUPING(EXPR) = 1, 그외의 결과는 GROUPINT(EXPR) = 0 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);

Oracle의 경우는 DECODE 함수를 사용해서 좀더 짧게 표현할 수 있다.

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 ROLLUP (DNAME, JOB);

 

STEP 4-1. 일부 칼럼에 ROLLUP 함수 사용

예제) GROUP BY DNAME, ROLLUP(JOB) 최종 소계 결과는 나오지 않음

STEP 4-2. 칼럼을 결합하여 ROLLUP 함수 사용

예제) GROUP BY ROLLUP (DNAME, (JOB, MGR)) 하나의 집합으로 간주하여 칼럼별 집계를 구하지 않음

 

3. CUBE 함수


결합 가능한 모든 값에 대하여 다차원 집계를 생성

그룹핑 칼럼의 순서를 바꿔서 한번 쿼리를 추가 수행하고 양쪽 쿼리에서 총계를 모두 생성함으로 연산 대상이 많아 시스템 부하의 단점이 있음

계층구조가 아니라 평등 관계임으로 인수 순서, 정렬순서는 바뀔 수있어도 데이터 결과는 같음

STEP 1. CUBE 함수 이용

칼럼이 가질 있는 모든 경우의 수예 대하여 SUBTATAL 생성됨으로 2 컬럼수에 대한 레벨의 SUBTATAL 발생

ROLLUP함수에 비해 업무별 집계를 표시한 추가적인 데이터가 생성

STEP 2. UNION ALL 사용

CUBE함수를 사용하면 반복 엑세스 하는 부분을 한번으로 줄일 있음, 수행속도 자원 사용율을 개선하고 가독성을 높힘

 

4. GROUPING SET 함수


다양한 소계 집합을 만들 있음, 여러 반복하지 않아도 원하는 결과 얻을 있음

인수별 개별 집계 가능하고 평등관계라 인수 순서 중요하지 않음

컬럼별의 총계들을 구함

 

STEP 1. 3개의 인수를 이용

괄호로 묶은 집합 별로 괄호 내는 계층 구조가 아닌 하나의 데이터로 간주하여 집계를 구할 있음

 

- Rollup(a,b,c) -

{a,b,c} 그룹의 합계

{a.b} 그룹의 합계

{a} 그룹의 합계

{} 전체 테이블에 대한 합계

 - Cube(a,b.c) -

Cube(a,b,c)

{a,b,c} 그룹의 합계 

{a,b}, {a,c}, {b,c} 그룹의 합계

{a}, {b}, {c} 그룹의 합계

{} 전체 테이블에 대한 합계


'자격증 공방 > SQLD' 카테고리의 다른 글

제 4-7절 DCL  (0) 2018.07.11
제 4-6절 윈도우 함수(WINDOW 함수)  (0) 2018.07.11
제 4-4절 서브쿼리  (0) 2018.07.11
제 4-3절 계층형 질의와 셀프 조인  (0) 2018.07.11
제 4-2절 집합 연산자 (SET OPERATOR)  (0) 2018.07.11

+ Recent posts