SQLD/2과목 : SQL 기본 및 활용
2.19 복합 쿼리 예제 4
qordnswnd123
2025. 7. 4. 12:25
✅ 복합 쿼리 예제 4
📌 1. 이 쿼리의 목적
상품별 + 월별 주문 수량을 집계하고,
각 상품의 총합과 전체 상품의 총합계도 함께 보여주는 통계 보고서 형태를 만들자!
📌 2. 사용된 핵심 SQL 기능

📌 3. SQL 쿼리 예시 (전체)
SELECT
CASE
WHEN GROUPING(p.product_name) = 1 THEN '상품 전체'
ELSE p.product_name
END AS 상품명,
CASE
WHEN GROUPING(TO_CHAR(o.order_date, 'MM')) = 1 THEN '총계'
ELSE TO_CHAR(o.order_date, 'MM') || '월'
END AS 주문월,
COUNT(*) AS 주문건수
FROM orders o
JOIN products p
ON o.product_id = p.product_id
GROUP BY ROLLUP(p.product_name, TO_CHAR(o.order_date, 'MM'))
ORDER BY
상품명, 주문월;
📌 4. 예제 결과 (예상 형태)

📌 5. 쿼리 실행 흐름 설명
- INNER JOIN
- 주문 테이블(orders)에 상품명을 붙이기 위해 products와 조인함.
- TO_CHAR(날짜, 'MM')
- 주문일에서 '월'만 뽑아 집계용으로 사용함.
- GROUP BY ROLLUP
- ROLLUP(product_name, 주문월)로 묶어:
- 상품명 + 월별로 주문건수 집계
- 상품별 총계
- 전체 총계까지 자동 생성
- ROLLUP(product_name, 주문월)로 묶어:
- GROUPING 함수 + CASE
- GROUPING() 함수로 "총계" 행을 감지하여,
- NULL 대신 "상품 전체", "총계" 등의 보기 좋은 텍스트로 출력
- GROUPING() 함수로 "총계" 행을 감지하여,
- ORDER BY
- 상품명 → 주문월 순서로 정렬하여 가독성 높임
✅ 시험 대비 요약 포인트
- ROLLUP은 총계 행 자동 생성
- GROUPING() 함수는 집계행 감지용
- CASE로 NULL 대신 텍스트 출력
- 정렬(ORDER BY)을 넣어야 보고서 형태로 정리됨
- TO_CHAR(날짜, 'MM') 사용 시 월 단위 집계 가능
🔁 확장 학습: "ROLLUP → CUBE"로 바꾸면?

실습해보면 CUBE는 더 많은 행이 나옵니다.
복잡하지만 다차원 분석에 유리합니다.