SQL

QCC 4회차 오답

sawo11 2025. 1. 16. 20:10

어쩌다보니 3회차보다 빨리 오답을 하게 된 4회차...😅

어제 SQL로 데이터 분석을 해봤던게 도움이 됐던 것 같다!


문제1 (O)

지역별매출이 가장 높은 매장의 매출을 조회하는 SQL 문을 작성해주세요. 단, 해당 지역에 매장이 두 개 이상인 경우만 결과에 포함해주세요. 결과는 지역 이름을 기준으로 오름차순으로 정렬해주세요.

SELECT REGION_NAME region_name,
	MAX(SALES) highest_sales
FROM stores
GROUP BY REGION_NAME
HAVING COUNT(STORE_ID) >= 2
ORDER BY region_name;

문제2 (X)

최근 특정 사용자들이 결제를 하지 않고 상품을 주문하거나, 결제를 하지 않은 시점에 이미 상품을 주문하는 버그가 발견되었습니다. 🐞 해당 버그를 악용한 사용자를 파악하기 위해 SQL 문을 작성해주세요. 다음 조건에 해당되는 사용자 수를 출력해주세요 :

  • 결제를 하지 않고 상품을 주문한 사용자
  • 첫 번째 결제일보다 이전에 상품을 주문한 사용자
WITH first_payment AS (
	SELECT USER_ID,
		MIN(PAY_DATE) AS FIRST_PAY_DATE
	FROM payments
	GROUP BY USER_ID
	)
SELECT COUNT(DISTINCT o.USER_ID) cnt
FROM orders o 
LEFT JOIN first_payment fp
ON o.USER_ID = fp.USER_ID 
WHERE fp.FIRST_PAY_DATE > o.ORDER_DATE 
OR fp.FIRST_PAY_DATE IS NULL;
  • 첫 번째 결제일보다 이전 이라는 말을 고려하지 못했다...
  • 하지만 아직 WITH 구문에 익숙하지 않아서 알았더라도 틀렸을지도?

문제3 (O)

데이터 분석팀은 고객이 특정 상품 X를 구매했을 때 상품 Y도 함께 구매할 확률을 분석하고자 합니다. 이를 위해, 쇼핑 카트 데이터에서 서로 다른 두 제품 X와 Y가 같은 주문(CART_ID)에 포함된 주문 수를 확인하려고 합니다.

  • 제품 X와 Y가 같은 주문에 포함된 경우를 계산합니다.
  • 두 제품은 서로 다른 이름이어야 하며, 한 쌍의 경우(예: Coffee와 Sausages)는 다른 순서(예: Sausages와 Coffee)로도 포함됩니다.
  • 결과는 각 제품 쌍과 해당 제품이 함께 포함된 주문 수를 반환해야 합니다.
  • 제품 이름 X와 Y를 기준으로 알파벳 순으로 오름차순 정렬합니다.
-- 나의 풀이
SELECT c.NAME name_x,
	cp.NAME name_y,
	COUNT(*) orders
FROM cart_products c
JOIN cart_products cp 
ON c.CART_ID = cp.CART_ID
WHERE c.NAME != cp.NAME 
GROUP BY 1, 2
ORDER BY 1, 2;

-- 튜터님 풀이
SELECT 
    A.NAME AS name_x, 
    B.NAME AS name_y, 
    COUNT(DISTINCT A.CART_ID) as orders 
FROM cart_products A
JOIN cart_products B
ON A.CART_ID = B.CART_ID AND A.NAME <> B.NAME
GROUP BY A.NAME, B.NAME
ORDER BY A.NAME, B.NAME;
  • 처음에는 좀 헤맸는데 JOIN을 떠올리니 그 다음부터는 어렵지 않았음..! 튜터님 풀이와의 차이점을 비교해 보자면 ▼
차이점 나의 풀이 튜터님 풀이
조건 적용 위치 WHERE 조건을 나중에 적용하므로 JOIN 과정에서 더 많은 데이터가 결합될 수 있음 JOIN 단계에서 조건을 미리 적용하므로, 불필요한 데이터가 결합되는 것을 방지
DISTINCT 사용 유무 중복 데이터가 포함될 가능성이 높아 추가 처리가 필요할 수 있음 DISTINCT를 활용하여 중복된 CART_ID를 제외하므로 정확하고 깔끔한 결과를 제공