inblog logo
|
DailyCoding
    SQLD

    2-2-3. 그룹 함수

    박은서's avatar
    박은서
    Mar 01, 2026
    2-2-3. 그룹 함수
    Contents
    1. ROLLUP1️⃣ ROLLUP 함수의 기초 개념2️⃣ ROLLUP 함수의 형식과 원리2. CUBE1️⃣ CUBE 함수의 기초 개념2️⃣ CUBE 함수의 원리3. GROUPING SETS1️⃣ GROUPING SETS 함수의 기초 개념2️⃣ GROUPING SETS 함수4. GROUPING1️⃣ GROUPING 함수의 기초 개념2️⃣ GROUPING 함수 형식5. 그룹 함수와 CASE 문 사용1️⃣ 그룹 함수에서 결과 가독성 높이기2️⃣ 그룹 함수와 CASE 문 사용3️⃣ 그룹 함수와 DECODE 함수 사용

    1. ROLLUP

    1️⃣ ROLLUP 함수의 기초 개념

    1) ROLLUP 함수

    • SQL에서 그룹화된 데이터의 다차원 집계를 생성하는 데 사용됨
      • 그룹화된 데이터의 다차원 집계(Multidimensional Aggregation)
        • 다양한 수준의 데이터 요약을 한 번의 쿼리로 계산하는 방법
        • 데이터의 특정 그루봐 기준에 따라 요약(집계)하는 작업을 여러 차원에서 수행하며,
          • 주로 데이터 분석과 비즈니스 인텔리전스(BI)에서 사용됨
    • GROUP BY 절과 함께 사용되며, 지정된 칼럼에 대한 소계와 합계를 계산하여 계층 구조 형성
      • → 다양한 수준에서의 집계 결과를 한 번의 쿼리로 얻을 수 있음
        계층 구조의 각 단계에서 소계(subtotal)와 전체 합계(grand total)계산
    • 다차원 분석(Multi-dimensional Analysis)과 데이터 요약에 유용

    2️⃣ ROLLUP 함수의 형식과 원리

    1) ROLLUP 함수의 형식

    • GROUP BY 뒤에 간단히 ROLLUP(칼럼명#1, 칼럼명#2, 칼럼명#3, …) 을 적으면 됨

    2) ROLLUP 함수의 예

    SELECT DEPTNO, JOB, SUM(SAL) AS TOTAL_SALARY FROM EMP GROUP BY ROLLUP(DEPTNO, JOB) ORDER BY DEPTNO;
    • ROLLUP 적용 전 : GROUP BY 적용
      • SELECT DEPTNO, JOB, SUM(SAL) AS TOTAL_SALARY FROM EMP GROUP BY DEPTNO, JOB ORDER BY DEPTNO;
        DEPTNO
        JOB
        TOTAL_SALARY
        10
        CLERK
        1300
        10
        MANAGER
        2450
        10
        PRESIDENT
        5000
        20
        ANALYST
        6000
        20
        CLERK
        1900
        20
        MANAGER
        2975
        30
        CLERK
        950
        30
        MANAGER
        2850
        30
        SLAESMAN
        5600
    • ROLLUP 적용 후 : GROUP BY ROLLUP 적용
      • DEPTNO
        JOB
        TOTAL_SALARY
        10
        CLERK
        1300
        10
        MANAGER
        2450
        10
        PRESIDENT
        5000
        10
        NULL
        8750
        20
        ANALYST
        6000
        20
        CLERK
        1900
        20
        MANAGER
        2975
        20
        NULL
        10875
        30
        CLERK
        950
        30
        MANAGER
        2850
        30
        SLAESMAN
        5600
        30
        NULL
        9400
        NULL
        NULL
        29025
      • DEPTNO가 10인 부서의 JOB 소계 8750
        • + DEPTNO가 20인 부서의 JOB 소계 10875
          + DEPTNO가 30인 부서의 JOB 소계 9400
          = DEPTNO 전체의 SAL 합계 29025
    💡
    NULL이 어떤 칼럼에 위치하는지 유심히 보고 이것이 ROLLUP 함수인지, CUBE 함수인지 판단
    ⚠️ 결과만 주어지고 어떤 함수인지 찾는 문제가 자주 출제

    2. CUBE

    1️⃣ CUBE 함수의 기초 개념

    1) CUBE 함수

    • SQL에서 다차원 집계 생성하는 데 사용됨
    • GROUP BY 절과 함께 사용되며, 지정된 칼럼에 대한 모든 가능한 조합의 소계와 합계 계산
    • ROLLUP 함수보다 소계 및 합계를 집계하는 경우의 수가 훨씬 다양함
    • 다차원 데이터 분석과 복잡한 집계를 쉽게 수행할 수 있음

    ※ ROLLUP 함수 vs CUBE 함수

    구분
    ROLLUP
    CUBE
    기본 개념
    계층적 소계(Hierarchical Subtotal) 생성
    모든 조합의 소계(All Combinations) 생성
    그룹 생성 방식
    지정한 컬럼 순서 기준으로 단계적 집계
    지정한 컬럼들의 가능한 모든 조합 집계
    생성 그룹 수
    n개 컬럼 → n+1개 그룹 단계
    n개 컬럼 → 2ⁿ개 그룹
    집계 방향
    좌 → 우 순서 기반 누적 집계
    컬럼 순서와 무관, 전체 조합 생성
    사용 목적
    계층 구조 리포트 (예: 연도 → 분기 → 월)
    다차원 분석 (OLAP 스타일 분석)
    성능 부담
    비교적 적음
    조합 수가 많아 상대적으로 큼
    예시
    GROUP BY ROLLUP(A, B) → (A,B), (A), ()
    GROUP BY CUBE(A, B) → (A,B), (A), (B), ()

    2️⃣ CUBE 함수의 원리

    1) CUBE 함수의 형식

    • GROUP BY 뒤에 간단히 CUBE(칼럼명#1, 칼럼명#2, 칼럼명#3, …) 을 적으면 됨

    2) CUBE 함수의 예

    SELECT DEPTNO, JOB, SUM(SAL) AS TOTAL_SALARY FROM EMP GROUP BY CUBE(DEPTNO, JOB) ORDER BY DEPTNO;
    • CUBE 적용 후 : GROUP BY CUBE 적용
      • DEPTNO
        JOB
        TOTAL_SALARY
        10
        CLERK
        1300
        10
        MANAGER
        2450
        10
        PRESIDENT
        5000
        10
        NULL
        8750
        20
        ANALYST
        6000
        20
        CLERK
        1900
        20
        MANAGER
        2975
        20
        NULL
        10875
        30
        CLERK
        950
        30
        MANAGER
        2850
        30
        SLAESMAN
        5600
        30
        NULL
        9400
        NULL
        ANALYST
        6000
        NULL
        CLERK
        4150
        NULL
        MANAGER
        8275
        NULL
        PRESIDENT
        5000
        NULL
        SALESMAN
        5600
        NULL
        NULL
        29025
      • JOB별 SAL 값을 전체 집계한 값도 출력

    3. GROUPING SETS

    1️⃣ GROUPING SETS 함수의 기초 개념

    1) GROUPING SETS 함수

    • 여러 그룹화 집합을 개별적으로 지정하여 그룹화된 데이터를 다차원적으로 집계하는 데 사용됨
    • GROUP BY 절에서 특정 칼럼의 조합으로 데이터를 그룹화하여 다양한 집계 결과 생성
    • ROLLUP과 CUBE의 일부 기능을 제공하면서 더 많은 제어 가능
    • ROLLUP이나 CUBE처럼 정해진 조합만 사용하는 것이 아니라, 사용자가 임의로 그룹화셋을 만들어 지정할 수 있음

    2️⃣ GROUPING SETS 함수

    1) GROUPING SETS 함수의 형식

    • GROUP BY 절 다음에 GROUPING SETS를 지정하는 형식
    • 괄호 안에 또 다른 괄호의 묶음을 지정하는데, 이 괄호의 묶음이 하나의 그룹을 의미
    SELECT 칼럼1, 칼럼2, ..., 집계 함수(칼럼) FROM 테이블 GROUP BY GROUPING SETS ( (칼럼1, 칼럼2,), // 칼럼1과 칼럼2 (하나의 그룹별 합계) (칼럼1), // 칼럼1별 합계 (칼럼2), // 칼럼2별 합계 () // 전체 합계 );

    2) GROUPING SETS 함수의 예

    SELECT DEPTNO, JOB, SUM(SAL) AS TOTAL_SALARY FROM EMP GROUP BY GROUPING SETS ( (DEPTNO, JOB), (DEPTNO), (JOB), () ) ORDER BY DEPTNO, JOB;
    DEPTNO
    JOB
    TOTAL_SALARY
    그룹화셋
    10
    CLERK
    1300
    (DEPTNO, JOB)
    10
    MANAGER
    2450
    (DEPTNO, JOB)
    10
    PRESIDENT
    5000
    (DEPTNO, JOB)
    10
    NULL
    8750
    (DEPTNO)
    20
    ANALYST
    6000
    (DEPTNO, JOB)
    20
    CLERK
    1900
    (DEPTNO, JOB)
    20
    MANAGER
    2975
    (DEPTNO, JOB)
    20
    NULL
    10875
    (DEPTNO)
    30
    CLERK
    950
    (DEPTNO, JOB)
    30
    MANAGER
    2850
    (DEPTNO, JOB)
    30
    SLAESMAN
    5600
    (DEPTNO, JOB)
    30
    NULL
    9400
    (DEPTNO)
    NULL
    ANALYST
    6000
    (JOB)
    NULL
    CLERK
    4150
    (JOB)
    NULL
    MANAGER
    8275
    (JOB)
    NULL
    PRESIDENT
    5000
    (JOB)
    NULL
    SALESMAN
    5600
    (JOB)
    NULL
    NULL
    29025
    ()

    4. GROUPING

    1️⃣ GROUPING 함수의 기초 개념

    1) GROUPING 함수

    • GROUP BY 절에서 ROLLUP, CUBE, GROUPING SETS와 함께 사용되어 각 행이 소계 또는 총계에 속하는지 여부 나타냄
    • ROLLUP, CUBE, CROUPING SETS 등의 함수는 집계 칼럼 값이 NULL로 출력 → 무엇이 소계이고, 무엇이 합계인지 알 수 없음 → 해당 함수 사용 시 그룹화한 칼럼을 SELECT 절에 GROUPING 함수로 짖ㅇ하여 그룹화 기준을 알 수 있게 함
    • SQL에서 데이터 그룹화할 때 사용되며, 주로 GROUP BY 절과 함께 사용됨
    • 각 그룹 수준에서 0 또는 1 반환
      • 0 : 집계 수준 의미
      • 1 : 해당 수준이 그룹화되지 않았음을 의미

    2️⃣ GROUPING 함수 형식

    1) GROUPING 함수의 형식

    • SELECT 절에서 사용됨
    • 괄호로 칼럼명 묶어줌

    2) GROUPING 함수의 예

    SELECT DEPTNO, JOB, SUM(SAL) AS TOTAL_SALARY, GROUPING(DEPTNO) AS DEPT_GROUPING, GROUPING(JOB) AS JOB_GROUPING FROM EMP GROUP BY GROUPING SETS ( (DEPTNO, JOB), (DEPTNO), (JOB), () ) ORDER BY DEPTNO, JOB;
    DEPTNO
    JOB
    TOTAL_SALARY
    DEPT_GROUPING
    JOB_GROUPING
    10
    CLERK
    1300
    0
    0
    10
    MANAGER
    2450
    0
    0
    10
    PRESIDENT
    5000
    0
    0
    10
    NULL
    8750
    0
    1
    20
    ANALYST
    6000
    0
    0
    20
    CLERK
    1900
    0
    0
    20
    MANAGER
    2975
    0
    0
    20
    NULL
    10875
    0
    1
    30
    CLERK
    950
    0
    0
    30
    MANAGER
    2850
    0
    0
    30
    SLAESMAN
    5600
    0
    0
    30
    NULL
    9400
    0
    1
    NULL
    ANALYST
    6000
    1
    0
    NULL
    CLERK
    4150
    1
    0
    NULL
    MANAGER
    8275
    1
    0
    NULL
    PRESIDENT
    5000
    1
    0
    NULL
    SALESMAN
    5600
    1
    0
    NULL
    NULL
    29025
    1
    1

    5. 그룹 함수와 CASE 문 사용

    1️⃣ 그룹 함수에서 결과 가독성 높이기

    1) 그룹 함수의 단점

    • SQL에서 계층적 집계를 생성하는 데 사용되며, 이를 통해 집계 레코드를 포함한 다양한 집계 수준을 동시에 얻을 수 있음
    • 하지만, 집계 시 NULL로 표시되어 가독성이 좋지 않음
    • GROUPING(칼럼명) 함수를 사용하면 어떤 칼럼의 집계값인지 알 수 있지만, 0과 1로 표시되기 때문에 한눈에 알아보기 어려움
    • 임의의 텍스트 칼럼명을 지정하여 무엇에 대한 집계값인지 출력하면, 결과를 훨씬 쉽계 알아볼 수 있음

    2) 단점 보완

    • 그룹 함수에서 임의의 텍스트 지정하려면 CASE 문 사용
    • 집계값을 구분하는 칼럼은 GROUPING(칼럼명) 함수의 결과 칼럼
      • 0과 1로 출력되는 GROUPING(칼럼명) 함수를 CASE 조건으로 사용하여 무엇에 대한 집계값인지 출력

    2️⃣ 그룹 함수와 CASE 문 사용

    1) ROLLUP, GROUPING, CASE 함수를 함께 사용한 예

    SELECT DEPTNO, JOB, SUM(SAL) AS TOTAL_SALARY GROUPING(DEPTNO) DEPTNO_GROUP, GROUPING(JOB) JOB_GROUP CASE WHEN GROUPING(DEPTNO) = 1 AND GROUPING(JOB) = 1 THEN 'TOTAL_SUM' WHEN GROUPING(DEPTNO) = 0 AND GROUPING(JOB) = 1 THEN 'DEPT_GROUPING' WHEN GROUPING(DEPTNO) = 0 AND GROUPING(JOB) = 0 THEN 'DEPT_JOB_GROUPING' END AS GROUPING_LEVEL FROM EMP GROUP BY ROLLUP(DEPTNO, JOB) ORDER BY DEPTNO, JOB;
    DEPTNO
    JOB
    TOTAL_SALARY
    DEPTNO_GROUP
    JOB_GROUP
    GROUPING_LEVEL
    10
    CLERK
    1300
    0
    0
    DEPT_JOB_GROUPING
    10
    MANAGER
    2450
    0
    0
    DEPT_JOB_GROUPING
    10
    PRESIDENT
    5000
    0
    0
    DEPT_JOB_GROUPING
    10
    NULL
    8750
    0
    1
    DEPT_GROUPING
    20
    ANALYST
    6000
    0
    0
    DEPT_JOB_GROUPING
    20
    CLERK
    1900
    0
    0
    DEPT_JOB_GROUPING
    20
    MANAGER
    2975
    0
    0
    DEPT_JOB_GROUPING
    20
    NULL
    10875
    0
    1
    DEPT_GROUPING
    30
    CLERK
    950
    0
    0
    DEPT_JOB_GROUPING
    30
    MANAGER
    2850
    0
    0
    DEPT_JOB_GROUPING
    30
    SLAESMAN
    5600
    0
    0
    DEPT_JOB_GROUPING
    30
    NULL
    9400
    0
    1
    DEPT_GROUPING
    NULL
    NULL
    29025
    1
    1
    TOTAL_SUM

    3️⃣ 그룹 함수와 DECODE 함수 사용

    1) DECODE 함수 (오라클)

    • 조건에 따라 값을 반환하는 함수
    • 그룹 함수뿐만 아니라 모든 쿼리문에서 CASE 문과 같은 역할을 하며 다양하게 활용됨

    2) DECODE 함수 형식

    DECODE(expression, search1, result1, search2, result2, ..., default)
    • expression : 평가할 값
    • search : 비교할 값(조건)
    • result : search 값과 expression이 일치할 때 반환할 값
    • default : 모든 search 값과 일치하지 않을 때 반환할 기본 값(생략 가능)

    3) DECODE 함수의 예

    • CASE 문
      • CASE WHEN GROUPING(DEPTNO) = 1 AND GROUPING(JOB) = 1 THEN 'TOTAL_SUM' WHEN GROUPING(DEPTNO) = 0 AND GROUPING(JOB) = 1 THEN 'DEPT_GROUPING' WHEN GROUPING(DEPTNO) = 0 AND GROUPING(JOB) = 0 THEN 'DEPT_JOB_GROUPING' END AS GROUPING_LEVEL
    • DECODE 함수
      • DECODE ( GROUPING(DEPTNO) + GROUPING(JOB), 2, 'TOTAL_SUM', 1, DECODE(GROUPING(DEPTNO), 1, 'JOB_GROUPING', 'DEPT_GROUPING'), 0, 'DEPT_JOB_GROUPING' ) AS GROUPING_LEVEL
      • 코드를 간결하게 작성할 수 있음
    Share article
    Contents
    1. ROLLUP1️⃣ ROLLUP 함수의 기초 개념2️⃣ ROLLUP 함수의 형식과 원리2. CUBE1️⃣ CUBE 함수의 기초 개념2️⃣ CUBE 함수의 원리3. GROUPING SETS1️⃣ GROUPING SETS 함수의 기초 개념2️⃣ GROUPING SETS 함수4. GROUPING1️⃣ GROUPING 함수의 기초 개념2️⃣ GROUPING 함수 형식5. 그룹 함수와 CASE 문 사용1️⃣ 그룹 함수에서 결과 가독성 높이기2️⃣ 그룹 함수와 CASE 문 사용3️⃣ 그룹 함수와 DECODE 함수 사용

    DailyCoding

    RSS·Powered by Inblog