Programing Language/SQL
2. JOIN + GROUP BY 문제
Data-SSung
2025. 6. 14. 23:21
반응형
🟢 연습문제 2-1: 기본 조인
[문제]
고객 테이블과 주문 테이블을 조인하여
각 고객별 총 주문 금액을 구하시오.
[테이블 구조]
customers: customer_id, customer_name, email, region
orders: order_id, customer_id, order_date, amount
-- 답
SELECT A.CUSTOMER_ID
, A.CUSTOMER_NAME
, SUM(AMOUNT) TOTAL_AMOUNT
FROM CUSTOMERS A
INNER JOIN ORDERS B
ON A.CUSTOMER_ID = B.CUSTOMER_ID
GROUP BY A.CUSTOMER_ID
, A.CUSTOMER_NAME
ORDER BY TOTAL_AMOUNT DESC
;
🔴 실전문제 2-1: 카테고리별 상위 고객 분석
[문제]
각 상품 카테고리별로 가장 많이 구매한 고객 TOP 3을 구하시오.
결과에는 카테고리명, 고객명, 해당 카테고리 구매 횟수, 구매 금액이 포함되어야 함.
[테이블 구조]
customers: customer_id, customer_name, email
orders: order_id, customer_id, order_date, amount
order_items: order_item_id, order_id, product_id, quantity, price
products: product_id, product_name, category_id, unit_price
categories: category_id, category_name
- 답
WITH CATE_CUST_TMP AS
SELECT E.CATEGORY_ID
, E.CATEGORY_NAME
, A.CUSTOMER_ID
, A.CUSTOMER_NAME
, COUNT(DISTINCT B.ORDER_ID) ORDER_CNT -- 주문 ID별 상품이 여러 개임
, SUM(C.quantity*C.price) TOTAL_PRICE
, ROW_NUMBER() OVER(PARTITION BY E.CATEGORY_ID, E.CATEGORY_NAME
ORDER BY SUM(C.quantity*C.price) DESC) RN -- 구매 금액 기준
FROM CUSTOMERS A
INNER JOIN ORDERS B
ON A.CUSTOMER_ID = B.CUSTOMER_ID
INNER JOIN ORDER_ITEMS C
ON B.ORDER_ID = C.ORDER_ID
INNER JOIN PRODUCTS D
ON C.product_id = D.product_id
INNER JOIN categories E
ON D.category_id = E.category_id
GROUP BY D.CATEGORY_ID
, D.CATEGORY_NAME
, A.CUSTOMER_ID
, A.CUSTOMER_NAME
)
SELECT CATEGORY_ID
, CATEGORY_NAME
, CUSTOMER_ID
, CUSTOMER_NAME
, ORDER_CNT
, TOTAL_PRICE
FROM CATE_CUST_TMP
WHERE RN <= 3
ORDER BY CATEGORY_ID, RN DESC
반응형