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. 쿼리 실행 흐름 설명

  1. INNER JOIN
    • 주문 테이블(orders)에 상품명을 붙이기 위해 products와 조인함.
  2. TO_CHAR(날짜, 'MM')
    • 주문일에서 '월'만 뽑아 집계용으로 사용함.
  3. GROUP BY ROLLUP
    • ROLLUP(product_name, 주문월)로 묶어:
      • 상품명 + 월별로 주문건수 집계
      • 상품별 총계
      • 전체 총계까지 자동 생성
  4. GROUPING 함수 + CASE
    • GROUPING() 함수로 "총계" 행을 감지하여,
      • NULL 대신 "상품 전체", "총계" 등의 보기 좋은 텍스트로 출력
  5. ORDER BY
    • 상품명 → 주문월 순서로 정렬하여 가독성 높임

 

✅ 시험 대비 요약 포인트

  • ROLLUP은 총계 행 자동 생성
  • GROUPING() 함수는 집계행 감지용
  • CASE로 NULL 대신 텍스트 출력
  • 정렬(ORDER BY)을 넣어야 보고서 형태로 정리됨
  • TO_CHAR(날짜, 'MM') 사용 시 월 단위 집계 가능

 

🔁 확장 학습: "ROLLUP → CUBE"로 바꾸면?

 

 

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