카테고리 없음
4차 QCC review
engwoon
2025. 1. 16. 17:24
≣ 목차
✏️ 1번
문제
`store` 테이블 이용
지역별로 매출이 가장 높은 매장의 매출을 조회
해당 지역에 매장이 2개 이상인 경우만 결과에 포함
결과는 지역이름 기준으로 오름차순
풀이
SELECT region_name, max(sales) as highest_sales
from stores s
group by 1
having count(distinct store_id) > 1
order by 1;
✏️ 2번
문제
`payments` `orders` 테이블 이용
다음 조건에 해당되는 사용자 수를 출력
- 결제를 하지 않고 상품을 주문한 사용자
- 첫 번째 결제일보다 이전에 상품을 주문한 사용자
풀이
WITH first_payment AS (
SELECT
USER_ID,
MIN(PAY_DATE) AS FIRST_PAY_DATE
FROM payments
GROUP BY USER_ID
) -- 모든 user의 첫번째 결제일
SELECT
COUNT(DISTINCT o.USER_ID) cnt
FROM orders o
LEFT JOIN first_payment fp
ON o.USER_ID = fp.USER_ID
WHERE fp.USER_ID IS NULL -- 결제 하지 않은 사용자
OR o.ORDER_DATE < fp.FIRST_PAY_DATE -- 첫번째 결제일보다 이전에 주문한 사용자
- with 절 -> 모든 user의 첫번째 결제일 테이블 `first_payment` 생성
- 메인 쿼리
- `orders left join first_payment` -> orders의 모든 user_id 불러와서 first_payment 와 조인
- `fp.user_id is null` -> 결제하지 않은 사용자 필터링
- `o.order_date < fp.first_pay_date` -> 첫번째 결제일보다 이전에 주문한 사용자 필터링
- `count(distinct o.user_id) cnt` -> 중복 제거된 user_id 개수 count
풀이2
SELECT count(distinct user_id) as cnt
FROM (
select o.user_id
from orders o left join payments p on o.user_id = p.user_id
where p.user_id is null -- 결제하지 않은 사용자
union
select o.user_id
from orders o left join (
select user_id, min(pay_date) as first_pay
from payments
group by user_id) f on o.user_id = f.user_id
where o.order_date < f.first_pay) as combined; -- 첫번째 결제일보다 이전에 주문한 사용자
- 결제하지 않은 사용자 테이블 & 첫번째 결제일 이전에 주문한 사용자 테이블 union
✏️ 3번
문제
`cart_products` 테이블 이용
제품 X와 Y가 같은 주문에 포함된 경우를 계산
- 두 제품은 서로 다른 이름이어야 하며, 한 쌍의 경우(예: Coffee와 Sausages)는 다른 순서(예: Sausages와 Coffee)로도 포함됨
- 결과는 각 제품 쌍 + 해당 제품이 함께 포함된 주문 수를 반환
- 제품 이름 X와 Y를 기준으로 알파벳 순으로 오름차순 정렬
풀이
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;
- 카트id는 같고 제품name은 다른 경우의 수를 출력해야 함
- `cart_products A` `cart_products B` 조인 -> 카트id가 같고, A제품이름과 B제품이름이 다른 경우 필터링
- `count(distinct a.cart_id) as orders` -> 각 제품 쌍이 포함된 주문 수 계산 (중복제거된 cart_id)
- ex) Bread, Butter 한쌍이 포함된 주문, 즉 cart_id가 몇개인지 count