SQL 집계함수: ROLLUP, CUBE, GROUPING SETS

m_ngyeong·2025년 3월 7일
0

SQLd

목록 보기
5/9

SQL 집계함수

CREATE TABLE 월별매출
(   상품ID   VARCHAR (10)    NOT NULL,VARCHAR (10)    NOT NULL,
	매출액	   NUMBER 		   NOT NULL);

INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES 	    ('P001', 2025.02, 7000);
INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES 	    ('P001', 2025.02, 13000);
INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES 	    ('P002', 2025.02, 10000);
INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES 	    ('P002', 2025.02, 11000);
INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES 	    ('P003', 2025.02, 9000);
INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES 	    ('P003', 2025.02, 10000);

INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES 	    ('P001', 2025.03, 25000);
INSERT INTO 	월별매출 (상품ID,, 매출액)
	VALUES   	('P002', 2025.03, 20000);
INSERT INTO 	월별매출 (상품ID,, 매출액)
     VALUES 	('P003', 2025.03, 23000);

GROUP BY 절

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

ROLLUP()

소그룹간의 합계를 계산하는 함수로, ROLLUP을 사용하면 GROUP BY로 묶은 각각의 소그룹 합계와 전체 합계를 모두 구할 수 있다.

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

  • GROUP BY절에 명시한 모든 컬럼에 대한 소그룹의 합계를 구해주는 것이 아니고 맨 처음 명시한 컬럼에 대해서만 소그룹 합계를 구함
  • 이때 각 그룹명은 따로 지정하지 않았기 때문에 NULL값으로 표시됨
GROUP BY ROLLUP(컬럼1, 컬럼2)
=
GROUP BY 컬럼1, 컬럼2
UNION ALL
GROUP BY 컬럼1
UNION ALL
모든 집합 그룹 결과

CUBE()

항목들 간의 다차원적인 소계를 계산한다. ROLLUP과 달리 GROUP BY절에 명시한 모든 컬럼에 대해 소그룹 합계를 계산한다.

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

  • 상품ID별 합계뿐만 아니라 월별 합계까지 한 번에 볼 수 있음
GROUP BY CUBE(컬럼1, 컬럼2)
=
GROUP BY 컬럼1, 컬럼2
UNION ALL
GROUP BY 컬럼1
UNION ALL
GROUP BY 컬럼2
UNION ALL
모든 집합 그룹 결과

GROUPING SETS()

특정 항목에 대한 소계를 계산하는 함수이다.

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

  • ROLLUP과 CUBE는 GROUP BY 결과에 소그룹 합계와 토탈 합계를 보여주지만 GROUPING SETS는 각 소그룹별 합계만 간단하게 보여줌
SELECT 상품ID,, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY 상품ID
UNION ALL
SELECT 상품ID,, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY;
  • GROUPING SETS 함수는 각각의 컬럼으로 GROUP BY한 값을 UNION ALL 한 것과 동일한 결과

GROUPING

직접적으로 그룹별 집계를 구하는 함수는 아니지만 위의 집계함수들을 지원하는 함수이다.
집계가 계산된 결과에 대해서는 1 값을 갖고, 그렇지 않은 결과에 대해서는 0 값을 가진다.

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

  • CASE WHEN문을 사용해, 단순 ROLLUP함수만 썼을 때 NULL값이었던 곳에 값을 넣어줌
  • 집계가 계산된 결과에 대해서만 값을 넣어주면 되기 때문에 GROUPING(컬럼명)=1인 경우에만 '모든상품ID' 또는 '모든월' 값을 부여, 0인 경우에는 원래대로 상품ID와 월을 써줌

참고, https://for-my-wealthy-life.tistory.com/44

profile
ʚȉɞ

0개의 댓글