데이터 분석/SQL

[SQL 문법] ROLLUP ( ) 절

참치바나나 2020. 11. 5. 19:26

GROUP BY를 한 컬럼을 기준으로 가능한 소계를 모두 보기 위해 사용한다

 

* roll up : 말아 올린다.

* 소계 : 영어로 subtotal, 전체가 아닌 어느 한 부분만을 셈한 합계 (출처 : 네이버 사전)

 

브랜드를 기준으로 각 세그먼트의 소계 및 전체 합계를 보고 싶다

지난 글에서 했듯이 GROUPING SETS를 통해 할 수 있다

SELECT brand, segment, sum(revenue)
FROM sales_items
GROUP BY 
	GROUPING SETS (
	(brand,segment),
	(brand),
	())
ORDER BY brand, segment;

 

이와 동일한 것이 ROLLUP

SELECT brand, segment, sum(revenue)
FROM sales_items
GROUP BY 
	ROLLUP (brand,segment)
ORDER BY brand, segment;

 

여러 글을 보니 ROLLUP 에 지정된 컬럼 수가 N개면 N+1 개의 레벨?까지 생긴다는 이해 안되는 말이 있는데 이게 무슨 뜻이냐면,

 

위의 sql은 ROLLUP () 괄호 안에 brand, segment의 2개 컬럼을 넣어 brand, segment를 롤업하겠다 지정했기에

  1. 각 brand 별 segment 별 합계 값
  2. 각 brand 별 합계 값
  3. 전체 brand의 합계 값

이렇게 3개 레벨이 생긴다. 결과는 위의 GRUOPING SETS와 같다

왜 항상 이런가 하면, ROLLUP은 추가적으로 (NULL이 등장하는) 소계를 보여주기 때문

개인적으로 김밥을 마는 것과 같다 생각했는데, brand의 abc의 합, xyz의 합, 그리고 말아 올려서 (abc의 합)과 (xyz의 합)의 합을 보여주니.

 

세그먼트를 기준으로 소계 및 전체 합계를 보고 싶다

위에서 브랜드brand를 빼고 롤업 하면

SELECT segment
	,sum(revenue)
FROM sales_items
GROUP BY 
ROLLUP (segment)
ORDER BY segment;

이 결과는

  1. 각 segment 별 합계 값
  2. 전체 segment의 합계 값

 

브랜드를 기준으로 각 세그먼트의 소계 및 브랜드 별 합계를 보고 싶다 - 분할 ROLLUP

전체 합계는 나오지 않으라는 것.

이땐 브랜드brand를 따로 group by 한다

SELECT
	brand,
	segment,
	sum(revenue)
FROM
	sales_items
GROUP BY
	brand ,
	ROLLUP (segment)
ORDER BY brand;

 

 

이쯤 되니 알겠는게 ROLLUP () 도 결국 brand와 같이 하나의 컬럼으로 보아도 될 듯. 단, 소계가 포함된 컬럼으로.

'데이터 분석 > SQL' 카테고리의 다른 글

[SQL 문법] 분석 함수  (0) 2020.11.05
[SQL 문법] CUBE () 절  (0) 2020.11.05
[SQL 문법] GROUPING SET 절, GROUPING 함수  (0) 2020.11.04
[SQL 문법] HAVING  (0) 2020.11.04
[SQL 문법] GROUP BY  (0) 2020.11.04