그룹 함수(group function) - CUBE

2020. 8. 30. 17:45✅ STUDY/SQL

안녕하세요! 
이전에 포스팅한 ROLLUP함수와 대비되는 CUBE함수에 대해 이야기해볼까 해요!
이전 포스팅을 참고해서, 비교하면서 이해해보면 좋을 것 같아요:)

 

CUBE 함수

개념)
- 다차원적인 소계를 계산할 수 있는 함수입니다. GROUP BY 뒤에 CUBE() 형태로 사용합니다. 

특징)
- 결합 가능한 모든 값에 대하여 다차원 집계를 생성합니다. 표시된 인수들에 대한 계층별 집계를 구할 수 있습니다.
- ROLLUP과 달리 인수의 순서가 달라져도 데이터 결과는 같습니다.
- ROLLUP보다 시스템에 부하가 심합니다.

실제로 한번 사용한 예시를 보며 개념과 특징을 이해해봐요~!

예시에 사용된 STARBUCKS_ORDER 테이블 데이터는 유튜버 'SQL전문가  정미나'님의 쿼리를 사용했습니다.
■ 테이블 생성 및 테스트 데이터 insert 쿼리 파일 링크: https://drive.google.com/file/d/125EU1Cl4fonO9zHvDviS9qasCD2RTJAp/view


Q1. 날짜별로 몇 잔을 팔았을까요?

(CUBE 사용 전)

날짜 별로 몇 잔을 팔았는지를 알기 위해서는, [날짜 별]로 group by을 해줘야할 것 입니다. 또한, 날짜 순으로 결과값을 보고 싶기 때문에 order by를 이용해 날짜별 정렬을 해줍니다.

select ORDER_DT, count(*) from STARBUCKS_ORDER
group by ORDER_DT
order by ORDER_DT;

-> 총 10개의 행이 인출되었으며, 날짜 별로 몇 잔을 팔았는지 count가 잘 나오죠?


(CUBE사용 후)

소그룹 간의 소계를 계산하는 cube함수를 쓰면 결과가 어떻게 나올지 눈으로 확인해봐요! 
그룹 함수이기 때문에, group by 뒤에 cube이라고 적어주고 () 괄호 안에, 어떤 컬럼의 소계를 하고싶은지 적어주면 된답니다.

select ORDER_DT, count(*) from STARBUCKS_ORDER
group by cube(ORDER_DT)
order by ORDER_DT;

-> cube를 사용하니, 사용하지 않았을 때보다 한 행이 더 추가된, 총 11개의 행이 인출되었습니다.
    group by 수행시 생성되는 표준 집계(10건)과 TOTAL(마지막 행, 1건)이 추가되었네요!

 


Q2. 날짜별, 주문 음료별 몇 잔을 팔았을까요?

(CUBE 사용 전)

날짜 별, 주문 음료별로 몇 잔을 팔았는지를 알기 위해서는, [날짜 별] [주문 음료별]로 group by을 해줘야할 것 입니다. 또한, 날짜 순으로 결과값을 보고 싶기 때문에 order by를 이용해 날짜별 정렬을 해줍니다.

select ORDER_DT, ORDER_ITEM, count(*) from STARBUCKS_ORDER
group by ORDER_DT, ORDER_ITEM
order by ORDER_DT;

-> 총 56개의 행이 인출되었으며, 날짜 별로 주문 음료별로 몇 잔을 팔았는지 count가 잘 나오죠?


(CUBE 사용 후)

소그룹 간의 소계를 계산하는 cube함수를 쓰면 결과가 어떻게 나올지 눈으로 확인해봐요! 
그룹 함수이기 때문에, group by 뒤에 cube이라고 적어주고 () 괄호 안에, 어떤 컬럼의 소계를 하고싶은지 적어주면 된답니다.

select ORDER_DT, ORDER_ITEM, count(*) from STARBUCKS_ORDER
group by cube(ORDER_DT, ORDER_ITEM)
order by ORDER_DT;

-> cube를 사용하니, 사용하지 않았을 때보다 21행이 더 추가된, 총 77개의 행이 인출되었습니다.
    group by 수행시 생성되는 표준 집계(56건)과 ORDER_DATE 별 SUBTOTAL(10건), ORDER_ITEM 별 SUBTOTAL(10건), TOTAL(마지막 행, 1건)이 추가되었네요!

 


Q3. 날짜별, 주문 음료별 몇 잔을 팔았을까요? (CUBE와 같은 결과로 인출해라)

select ORDER_DT, ORDER_ITEM, count(*) from STARBUCKS_ORDER
group by CUBE(ORDER_DT, ORDER_ITEM)
order by ORDER_DT;

select ORDER_DT, ORDER_ITEM, count(*) from STARBUCKS_ORDER
group by ORDER_DT, ORDER_ITEM
UNION ALL
select ORDER_DT, NULL, count(*) from STARBUCKS_ORDER
group by ORDER_DT
UNION ALL
select NULL, ORDER_ITEM, count(*) from STARBUCKS_ORDER
group by ORDER_ITEM
UNION ALL
select  NULL, NULL, count(*) from STARBUCKS_ORDER
order by 1,2;

-> 위의 두 쿼리는 같은 결과를 인출합니다. CUBE에 대해 이해를 하고 계신다면 어렵지 않습니다.
기출로 많이 출제되는 문제니까 꼭 알아두세요~.~

 

 


* 결론 *

CUBE 함수는 다차원적인 소계를 계산할 수 있는 함수입니다. GROUP BY 뒤에 CUBE() 형태로 사용합니다. 

- 결합 가능한 모든 값에 대하여 다차원 집계를 생성합니다. 표시된 인수들에 대한 계층별 집계를 구할 수 있습니다.
- ROLLUP과 달리 인수의 순서가 달라져도 데이터 결과는 같습니다.
- ROLLUP보다 시스템에 부하가 심합니다.

 

영상으로 이해하고 싶으시다면, 제가 도움을 받은 유튜브 영상을 참고해주세요!


'SLQ전문가 정미나'님의 영상입니다.

https://www.youtube.com/watch?v=Hr3lD0BV3Rk&t=301s