(Oracle) 그룹 기능(ROLLUP, CUBE, GROUPING 등)


이들은 Oracle의 다양한 그룹 기능입니다.

CREATE TABLE 월별매출 (
    상품ID VARCHAR2(5),
    월 VARCHAR2(10),
    회사 VARCHAR2(10),
    매출액 INTEGER );
    
INSERT INTO  월별매출 VALUES ('P001', '2019.10', '삼성', 15000);
INSERT INTO  월별매출 VALUES ('P001', '2019.11', '삼성', 25000);
INSERT INTO  월별매출 VALUES ('P002', '2019.10', 'LG', 10000);
INSERT INTO  월별매출 VALUES ('P002', '2019.11', 'LG', 20000);
INSERT INTO  월별매출 VALUES ('P003', '2019.10', '애플', 15000);
INSERT INTO  월별매출 VALUES ('P003', '2019.11', '애플', 10000);

SELECT * FROM 월별매출;

먼저 그룹 기능을 사용하기 위한 샘플 테이블을 생성해 보겠습니다.

1. GROUP BY 절

SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY 상품ID, 월;

그룹 함수를 작성하기 전에 간단한 GROUP BY 절을 수행해 보겠습니다.


제품 ID와 월별로 그룹화되어 있는 것을 볼 수 있습니다.

2. 롤업 기능

SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY ROLLUP(상품ID, 월);

위의 SQL 문을 실행하면 다음과 같은 결과가 나온다.

GROUP BY 절을 실행할 때와 달리 소계와 총계가 출력되는 것을 볼 수 있다.

ROLLUP 함수 사용
첫 번째 요소(제품 ID) 이후의 두 번째 요소(월) + 첫 번째 요소(제품 ID) 이후의 두 번째 요소(월)의 소계 + 총계
항복

따라서 ROLLUP 함수는 인수의 순서에도 영향을 받습니다.

SELECT 월, 상품ID, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY ROLLUP(월, 상품ID);

(차이점을 쉽게 볼 수 있도록 열의 순서를 변경했습니다.

)

이전과 달리
두 번째 요소(제품 ID)를 첫 번째 요소(월)로 나눈 값 + 소계(SUBTOTAL) 두 번째 요소(제품 ID)를 첫 번째 요소(월)로 나눈 값 + 총계(GRAND TOTAL)
항복

3. 큐브 기능

SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY CUBE(상품ID, 월);

ROLLUP 기능을 사용했을 때보다 결과의 수가 늘어난 것을 느낄 수 있을 것입니다.

CUBE 함수는 가능한 모든 그룹화 열 수에 대해 SUBTOTAL 및 GRAND TOTAL을 생성합니다.

따라서 ROLLUP 함수와 달리 인자의 순서가 달라도 결과는 같다.


또한 위와 달리 단순 월별 소계가 생성되며, by-column의 개수가 N일 때 2의 N승 소계가 생성된다.

4. 그룹화 집합 기능

SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY GROUPING SETS(상품ID, 월);

소계는 첫 번째 요소(제품 ID) 뒤에 나타나고 소계는 두 번째 요소(월) 뒤에 나타납니다.


ROLLUP 및 CUBE와 달리 계층 구조가 나타나지 않으므로 인수의 순서가 달라도 결과는 동일합니다.

또한 GROUPING SETS 함수는 괄호로 묶인 각 집합에 대한 집계를 얻을 수 있습니다.

SELECT 상품ID, 월, 회사, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY GROUPING SETS((상품ID, 월), 회사);

그룹화된 열이 단일 요인으로 처리되어 (제품 ID, 월)별 소계와 회사별 소계가 표시되는 것을 확인할 수 있습니다.

5. 그룹화 기능

GROUPING 함수는 그룹별 집계를 직접 가져오는 것이 아니라 위에서 언급한 ROLLUP, CUBE 및 GROUPING SETS를 지원하기 위한 것입니다.

GROUPING(expression) = 집계가 계산된 결과에 대해 1이고, 그렇지 않으면 GROUPING(expression) = 0입니다.

SELECT 
    CASE GROUPING(상품ID) WHEN 1 THEN '모든 상품ID' ELSE 상품ID END AS 상품ID,
    CASE GROUPING(월) WHEN 1 THEN '모든 월' ELSE 월 END AS 월, 
    SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY ROLLUP(상품ID, 월);

CASE 함수와 ROLLUP 함수를 이용하여 다음과 같은 표현도 가능합니다.

SELECT 
    CASE GROUPING(상품ID) WHEN 1 THEN '모든 상품ID' ELSE 상품ID END AS 상품ID,
    CASE GROUPING(월) WHEN 1 THEN '모든 월' ELSE 월 END AS 월, 
    SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY CUBE(상품ID, 월);


SELECT 
    CASE GROUPING(상품ID) WHEN 1 THEN '모든 상품ID' ELSE 상품ID END AS 상품ID,
    CASE GROUPING(월) WHEN 1 THEN '모든 월' ELSE 월 END AS 월, 
    CASE GROUPING(회사) WHEN 1 THEN '모든 회사' ELSE 회사 END AS 회사,
    SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY GROUPING SETS((상품ID, 월), 회사);

이는 CUBE 기능과 GROUPING SETS 기능에도 적용할 수 있습니다.

6. 참조.

데이터 전문지식포털 DBGuide.net, http://www.dbguide.net/db.db?cmd=view&boardUid=148204&boardConfigUid=9&categoryUid=216&boardIdx=135&boardStep=1


원천 : https://velog.io/@dongchyeon/%EC%98%A4%EB%9D%BC%ED%81%B4Oracle-%EA%B7%B8%EB%A3%B9-%ED%95%A8% EC%88%98-ROLLUP-CUBE-GROUPING-%EB%93%B1

(Oracle) 그룹 기능(ROLLUP, CUBE, GROUPING 등)

그룹 기능을 다시 요약해 보겠습니다.

velog.io

error: Alert: Content selection is disabled!!