Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

dongdorodongdong

그룹함수 본문

SQLD

그룹함수

d5ngs 2019. 10. 25. 14:44

AGGREGATE FUNCTION

  • GROUP AGGREGATE FUNCTION이라고 부름
  • COUNT, SUM, AVG, MAX, MIN 외 각종 집계 함수

GROUP FUNCTION
  • ROLLUP, CUBE, GROUPING SETS
  • 일반 그룹 함수로 동일한 결과 추출 가능
  • 집계 대상 컬럼 이외의 GROUP 대상 컬럼의 값은 NULL을 반환

ROLLUP
  • 특징
    - GROUP BY의 확장된 형태로 사용하기가 쉬움
    - 인자로 주어진 컬럼의 순서에 따라 다른 결과를 추출
    - SELECT절에 ROLLUP을 사용함으로써 보통의 SELECT된 데이터와 그 데이터의 총계를 구할 수 있음

  • 코드
    -
    SELECT deptno, SUM(sal)
    FROM emp
    GROUP BY deptno;


    # deptno를 그룹지어서 SUM(집계)

    -
    SELECT deptno, SUM(sal)
    FROM emp
    GROUP BY ROLLUP(deptno);


    # deptno에 대해서 ROLLUP(deptno의 합계)

    -
    SELECT deptno, class, SUM(sal)
    FROM emp
    GROUP BY ROLLUP(deptno, class);


    # deptno와 class를 함께 그룹지어서 SUM(집계)
    # 우선 class에 대해서 ROLLUP을 하고, 마지막에 deptno에 대해서 ROLLUP

GROUPING
  • 특징
    - 파라미터의 값이 NULL이면 1, 아니면 0을 반환
    - GROUPING 함수에서 사용될 컬럼은 반드시 GROUP BY 절에서 명시

  • 코드
    -
    테이블 : 서비스

    테이블 : 서비스가입

    -
    SELECT
         CASE WHEN GROUPING(A.id) = 0 THEN a.id ELSE '합계' END as 서비스id
        ,CASE WHEN GROUPING(b.dd) = 0 THEN NVL(b.dd,'-') ELSE '소계' END as 가입일자
        ,count(b.c_id) as 가입건수
    FROM
        서비스 A LEFT OUTER JOIN 서비스가입 B
            ON(a.id = b.id AND b.dd BETWEEN '2013-01-01' AND '2013-01-31')
        GROUP BY ROLLUP(a.id, b.dd);


    # 서비스ID(A.id)가 NULL이 아니면 A.id가 그대로 반환, NULL이면 '합계'로 반환
    # 가입일자(B.dd)가 NULL이 아니면 B.dd가 그대로 반환, NULL이면 '소계로 반환'
    # 합계, 소계의 NULL을 떠나 B.dd 자체 값이 NULL이면 NVL에 의해 '-'로 표시(LEFT OUTER JOIN에 의해 NULL값이 생김)
    # GROUP BY ROLLUP에 의해서 합계, 소계

CUBE
  • 특징
    - 결합 가능한 모든 값에 대하여 다차원적인 집계 생성
    - ROLLUP에 비해 다양한 데이터를 얻을 수 있음
    - 시스템에 부하를 많이 줌
    - ROLLUP에 의해 나타나는 값의 합계와 컬럼의 합계를 나타 낼 수 있다.

  • 코드
    -
    SELECT deptno, class, SUM(sal)
    FROM emp
    GROUP BY CUBE(deptno, class);


    # ROLLUP과는 다르게 소계 및 합계가 상위에 나타남
    # 2,3,4 행은 CUBE에서만 볼 수 있는 행인데, class에 대한 전체 합계도 나타남
    # GROUPING SETS((deptno), (class), (deptno, class), ())로 변경할 수 있다.


GROUPING SETS
  • 특징
    - 원하는 부분의 소계만 손쉽게 추출 가능
    - GROUP BY들의 UNION ALL이라고 볼 수 있음

  • 코드
    -
    SELECT deptno, class, SUM(sal)
    FROM emp
    GROUP BY GROUPING SETS(deptno, class);

    # deptno에 대한 GROUP BY와 class에 대한 GROUP BY가 합쳐져있다.











'SQLD' 카테고리의 다른 글

DCL  (0) 2019.10.25
윈도우 함수  (0) 2019.10.25
서브쿼리  (0) 2019.10.25
계층형 질의 / 셀프 조인  (0) 2019.10.25
집합연산자  (0) 2019.10.25