본문 바로가기
코딩테스트/SQL 코테

[solvesql] 할부는 몇개월로 해드릴까요 해설

by 코듀킹 2024. 7. 7.

solvesql 할부는 몇개월로해드릴까요 sql 문제 정답 및 해설입니다.

 

 

정답

select
  payment_installments,
  count(distinct order_id) as order_count,
  min(payment_value) as min_value,
  max(payment_value) as max_value,
  avg(payment_value) as avg_value
from
  olist_order_payments_dataset
where
  payment_type = 'credit_card'
group by
  payment_installments;

 

 

해설

정답률이 매우 낮길래 어렵나 하고 문제를 풀어봤는데, 생각보다 너무 쉬워서 '왜 정답률이 낮지?' 라고 의아해하면서 정답을 눌렀는데, 오답이었다.

 

이유는 문제를 정확하게 읽지 않아서였다. '신용카드'로 주문한 내역만 필터링을 해야했기 때문에 Where payment_type = 'credit_card' 조건을 걸어주어야했다.

 

또한, 주문 수 집계를 처음엔 count(order_id)로 했으나, 정답은 count(distinct order_id) 였다. 원인을 알아보기 위해 아래와 같이 쿼리를 작성해서 살펴보았더니, order_id는 유니크 값이 아니라는 걸 알게 되었다. 

 

select
  order_id,
  count(*)
from
  olist_order_payments_dataset
group by
  order_id
order by
  2 desc
limit
  100;

 

 

 

주문 ID가 어째서 유니크 값이 아닌걸까? 그 이유는 olist_order_items_dataset에서의 order_id가 유니크 값이기 때문이다.

아래와 같이 쿼리를 작성한 다음 첫행의 order_id의 주문 기록만 뽑아보자.

select a.order_id, min(payment_sequential), max(payment_sequential) as max
from olist_order_payments_dataset a
left join olist_order_items_dataset b
on a.order_id = b.order_id
group by a.order_id
order by 3 desc
limit 100;

 

 

그러면 아래와 같이 똑같은 order_id인데, 총 29번 연속 결제를 했다고 나온다. 여기서 나온 payment_value를 모두 합친 값과 olist_order_items_dataset 테이블의 price + freight_value 값이 똑같이 나온다. 즉, olist_order_payments_dataset은 장바구니에 여러 상품을 담아놓고, 한꺼번에 결제했을 때 하나하나의 상품의 기록이 배송비 포함해서 쌓이는 테이블이라고 유추해볼 수 있다.

 

olist_order_payments_dataset 테이블

select *
from olist_order_payments_dataset
where order_id = 'fa65dad1b0e818e3ccc5cb0e39231352';

select sum(payment_value)
from olist_order_payments_dataset
where order_id = 'fa65dad1b0e818e3ccc5cb0e39231352'
order by payment_sequential desc;

 

olist_order_items_dataset 테이블

select *
from olist_order_items_dataset
where order_id = 'fa65dad1b0e818e3ccc5cb0e39231352'

select price + freight_value
from olist_order_items_dataset
where order_id = 'fa65dad1b0e818e3ccc5cb0e39231352';

 

 

그래서 결론은 주문수를 정확하게 계산하려면 count(distinct order_id)를 해야한다. 

댓글