SQL/문제

SQL | QCC 4회차

jjangdoll 2025. 1. 21. 11:58

1번 

지역별매출이 가장 높은 매장의 매출을 조회.

단, 해당 지역에 매장이 두 개 이상인 경우만 결과에 포함

결과는 지역 이름을 기준으로 오름차순

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

2번

다음 조건에 해당되는 사용자 수를 출력 :

  • 결제를 하지 않고 상품을 주문한 사용자
  • 첫 번째 결제일보다 이전에 상품을 주문한 사용자

내가 쓴 답 : 

WITH a AS(
	SELECT USER_ID, MIN(PAY_DATE) AS first_pay_date
	FROM payments
	GROUP BY 1)
SELECT COUNT(o.USER_ID) AS cnt
FROM orders o LEFT JOIN a ON o.USER_ID = a.USER_ID LEFT JOIN payments p ON o.USER_ID = p.USER_ID 
WHERE  p.PAY_DATE IS NULL OR o.ORDER_DATE < a.first_pay_date;

정답 : 

WITH a AS(
	SELECT USER_ID, MIN(PAY_DATE) AS first_pay_date
	FROM payments
	GROUP BY 1)
SELECT COUNT(DISTINCT o.USER_ID) AS cnt
FROM orders o LEFT JOIN a ON o.USER_ID = a.USER_ID LEFT JOIN payments p ON o.USER_ID = p.USER_ID 
WHERE  p.PAY_DATE IS NULL OR o.ORDER_DATE < a.first_pay_date;

📍distinct... 


3번

서로 다른 두 제품 X와 Y가 같은 주문(CART_ID)에 포함된 주문 수 조회

  • 제품 X와 Y가 같은 주문에 포함된 경우를 계산
  • 두 제품은 서로 다른 이름, 한 쌍의 경우(예: Coffee와 Sausages)는 다른 순서(예: Sausages와 Coffee)로도 포함
  • 결과는 각 제품 쌍과 해당 제품이 함께 포함된 주문 수를 반환
  • 제품 이름 X와 Y를 기준으로 알파벳 순으로 오름차순

내가 쓴 답 : 

SELECT 
	cp2.NAME AS name_x,
	cp.NAME AS name_y,
	COUNT(*) AS orders
FROM cart_products cp CROSS JOIN cart_products cp2 
GROUP BY 1,2
HAVING cp.NAME != cp2.NAME
ORDER BY 1,2 ;

📍 이럴 경우 모든 가능한 조합이 중복으로 생겨서 조건을 붙여줘야 함.

정답 (CROSS JOIN 쓸 경우) : 

WHERE cp.CART_ID = cp2.CART_ID

위 코드에 where 조건 붙이면 해결

정답(SELF JOIN 쓸 경우) :  

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
GROUP BY 1,2
HAVING a.NAME != b.NAME 
ORDER BY 1,2 ;

💡 이 경우에는 distinct 안 써도 정답이지만 항상 distinct 생각하기..


그냥 셀프 조인 했으면 맞았을텐데.. 하지만 생각이 안 남ㅎ

'SQL > 문제' 카테고리의 다른 글

SQL | QCC 6회차  (0) 2025.03.14
SQL | QCC 5회차  (0) 2025.02.28
SQL | Binary Tree Nodes, New Companies  (0) 2025.01.17
SQL | 대장균의 크기에 따라 분류하기 2  (0) 2025.01.14
SQL | QCC 3회차  (0) 2025.01.13