ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQLD 요약] II. SQL 기본 및 활용 - 02. SQL 활용 (3) - Group Function (그룹함수)
    자격증/SQLD (SQL 개발자) 2021. 5. 8. 11:21
    728x90
    반응형

     

     

    SQLD 요약 / SQL Developer 요약

    🔑 그룹함수/ Group Function/ GROUP BY/ ROLLUP/ GROUPING SETS/ CUBE/ GROUPING

     

    II. SQL 기본 및 활용

       02. SQL 활용

              [1] 조인 (JOIN)

              [2] 계층형 조회 (Connect by)

              [3] 서브쿼리 (Subquery)

              [4] 그룹함수 (Group Function)

     

     



     

    02. SQL 활용

     

    [4] 그룹함수 (Group Function)

    ROLLUP GROUPING GROUPING SETS CUBE
    - GROUP BY절과 함께 사용
    - 집합의 소계/총계 계산
    - 칼럼 순서에 따라 결과 다름
    - 소계/총계 계산 식별
    - 합계 계산되면 1
    - 합계가 아니면 0
    - GROUP BY절과 함께 사용
    - 칼럼 순서와 관계없음
    - 칼럼 순서 달라도 결과 같음
    - GROUP BY절과 함께 사용
    - 다차원 집계
    - 가능한 모든 결합 계산

     

     

    (1) ROLLUP | GROUP BY의 칼럼에 대해 Subtotal 생성

    • GROUP BY절과 함께 사용 → 그룹화된 집합에 대해 더 상세한 정보를 생성
    • 기존에 SELECT된 데이터의 소계, 총계를 구할 수 있음

    • 예시 (1) : DEPTNO에 대해 GROUP BY로 합계 계산, 그리고 전체합계를 추가 계산
      - 기존 GROUP BY와 다르게, ROLLUP으로 전체합계까지 계산할 수 있음
    # ROLLUP으로 부서별합계, 전체합계 계산 및 조회
    # DECODE문은 전체합계를 조회할 때 문자를 출력하기 위해 사용함!
    # DECODE: DEPTNO = NULL이면 '전체합계', 아니면 부서번호를 출력
    SELECT DECODE(DEPTNO, NULL, '전체합계', DEPTNO), SUM(SAL)
      FROM EMP
      GROUP BY ROLLUP(DEPTNO);

     

     

    • GROUP BY구에 칼럼이 2개 이상 → 순서에 따라 결과 달라짐!
    • 예시 (2) : 부서별, 직업별, 전체 합계 계산
      - ROLLUP으로 실행되는 칼럼별로, Subtotal을 생성함
    # GROUP BY구에 칼럼 2개 이상
    SELECT DEPTNO, JOB, SUM(SAL)
      FROM EMP
      GROUP BY ROLLUP(DEPTNO, JOB);

     

     

    • 예시 (3): 부서별로 인원수 & 급여합계 계산 및 조회
    SELECT B,DNAME, A.JOB, 
           SUM(A.SAL) SAL, 
           COUNT(A.EMPNO) EMP_COUNT	# 인원 카운트
      FROM EMP A, DEPT B
      WHERE A.DEPTNO = B.DEPTNO
      GROUP BY ROLLUP(B.DNAME, A.JOB);	# 부서별로 급여합계SUM, 전체인원COUNT 조회

     


     

     

    (2) GROUPING 함수 | 생성된 합계값을 원래 데이터와 구분

    • ROLLUP, GROUPING SETS, CUBE로 생성하는 합계값을 구분하기 위한 함수

    • 1,0 을 반환하여 개발자가 합계값을 식별할 수 있게 해줌
      - 소계/합계 등이 계산되면 → 1
      - 소계/합계 등이 아니면 → 0
    # GROUPING 함수 예시
    # DECODE 함수로 '부서합계' 혹은 '전체합계'를 출력
    SELECT DEPTNO, DECODE(GROUPING(DEPTNO), 1, '전체합계') TOT,
           JOB, DECODE(GROUPING(JOB), 1, '부서합계') T_DEPT, 
           SUM(SAL)
      FROM EMP
      GROUP BY ROLLUP(DEPTNO);

     


     

     

    (3) GROUPING SETS 함수 | 칼럼 순서와 관계없이, 다양한 소계(Subtotal) 생성

    • GROUP BY구의 칼럼 순서와 관계없이 모든 소계를 개별적으로 처리함
    • 칼럼간 서로 관계가 없으므로, 순서가 바뀌어도 결과는 같음
    # 칼럼 순서와 관계없이 직업별, 부서별 합계 계산 및 조회
    SELECT DEPTNO, JOB, SUM(SAL)
      FROM EMP
      GROUP BY GROUPING SETS(DEPTNO, JOB);
      # DEPTNO, JOB을 각각의 그룹으로 합계 계산

     


     

     

    (4) CUBE 함수 | 다차원 집계/ 가능한 모든 집계 계산

    • 다차원 집계: 제시한 칼럼에 대해서, 조합할 수 있는 모든 경우의 수 / 결합 가능한 모든 집계를 계산함
    • 예시 (1): 전체합계, 직업별합계, 부서별합계, 부서별-직업별합계 모두 계산 및 조회
    # CUBE 함수 예시
    SELECT DEPTNO, JOB, SUM(SAL)
      FROM EMP
      GROUP BY CUBE(DEPTNO, JOB);

     

     

    • CUBE함수는 ROLLUP에 의해 나타나는 Item Total, Column Total 값을 계산함
    • 예시 (2): 부서별-직업별 급여합계 및 전체인원, 직업별로 급여합계 및 전체인원 조회
    SELECT B.DNAME, A.JOB, 
           SUM(A.SAL) SAL, 			# 급여합계
           COUNT(A.EMPNO) EMP_COUNT	# 전체인원
      FROM EMP A, DEPT B
      WHERE A.DEPTNO = B.DEPTNO
      GROUP BY CUBE(B.DNAME, A.JOB);

     


     

    참고도서: SQL 개발자 이론서+기출문제_이기적, 2020

    참고링크 1: www.gurubee.net/lecture/1845

    참고링크 2: www.gurubee.net/lecture/1846

     

     

    728x90
    반응형