그룹 함수(group function) - ROLLUP

2020. 8. 30. 16:58✅ STUDY/SQL

안녕하세요!
요즘 SQLD 자격증 시험 준비를 하고있는데, 꼭 한 문제씩 출제되는 그룹함수 개념이 어렵더라구요ㅠ

저랑 같이 오늘 개념 깨봐요~~~!

 

ROLLUP 함수

개념)
- 소그룹 간의 소계를 계산하는 함수입니다. GROUP BY 뒤에 ROLLUP() 형태로 사용합니다.

특징)
- Group한 Columns의 Subtotal을 생성하기 위해 사용하고, Grouping Columns의 수를 N이라고 했을 때 N+1 Level의 Subtotal이 생성됩니다.

- ROLLUP의 인수는 계층 구조이므로 인수 순서가 바뀌면 수행 결과도 바뀌게 되므로, 인수의 순서에 주의해야 합니다.

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

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


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

(Rollup 사용 전)

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

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

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


(Rollup 사용 후)

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

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

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

 

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

(Rollup 사용 전)

날짜 별, 주문 음료별로 몇 잔을 팔았는지를 알기 위해서는, [날짜 별] [주문 음료별]로 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가 잘 나오죠?


(Rollup 사용 후)

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

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

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


근데, 날짜 별 소계가 아닌 주문 음료별 소계를 하고싶다면 어떻게 해야할까요?
ROLLUP함수의 특징인
- ROLLUP의 인수는 계층 구조이므로 인수 순서가 바뀌면 수행 결과도 바뀌게 되므로, 인수의 순서에 주의해야 합니다.
이 점을 기억해주시면 돼요!
ROLLUP(ORDER_DT, ORDER_ITEM) 이렇게 사용했기 때문에 날짜 별 소계가 나온 것입니다. 그렇다면 인수 순서를 반대로 해주면 ORDER_ITEM별 소계가 나오겠죠?

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


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

select ORDER_DT, ORDER_ITEM, count(*) from STARBUCKS_ORDER
group by rollup(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, NULL, count(*) from STARBUCKS_ORDER
order by 1,2;

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

 


* 결론 *

ROLLUP함수는 소그룹 간의 소계를 계산하는 함수입니다.
- Group한 Columns의 Subtotal을 생성하기 위해 사용하고, Grouping Columns의 수를 N이라고 했을 때 N+1 Level의 Subtotal이 생성됩니다.

- ROLLUP의 인수는 계층 구조이므로 인수 순서가 바뀌면 수행 결과도 바뀌게 되므로, 인수의 순서에 주의해야 합니다.

 

 

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


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

https://www.youtube.com/watch?v=cy9Xiim1X94