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 |