CODEKATA SQL

COZY·2024년 5월 21일

CODEKATA

목록 보기
10/11
post-thumbnail

우유와 요거트가 담긴 장바구니

✔️문제 포인트
1. 우유와 요거트를 동시에 구입한 장바구니 id만
(=Milk와 Yogurt가 모두 있는 cart_id)
id는 한 품목당 하나씩 부여가 되므로 중복되지 않음.
cart_id는 중복되지 않음
*name은 중복될 수 있음
2. 장바구니 id순 정렬

💟풀이

SELECT cart_id
from cart_products
where name in ('Milk','Yogurt')
#1. name이 milk또는 yogurt인 것
group by cart_id
#2. cart_id별로 묶는다
having count(distinct name)=2
#3. 묶인 id당 가지고 있는 name의 고유한 갯수가 2개 인것
-- (=milk와 yogurt가 각각 한 개 씩 총 두 개가 있는 id)
order by cart_id
#4. cart_id별 정렬

〰️풀이 해설〰️
: 쿼리의 작동 순서에 대한 인지가 필요함.
SQL에서는 기본적으로 쿼리가
FROM - ON - JOIN - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 순으로 작동함

그렇다면 순서에 맞게 작성을 해보자.

  1. where절을 사용해 우유나 요거트가 있는 name을 가지고 있는 경우만 남김
    = name컬럼이 우유와 요거트인 기록만 남음
    where name in ('Milk','Yohgurt')
  • 만약 데이터에서 ~우유, ~요거트 처럼 상표나 맛이 품목 앞에 추가된 경우,
    또는 대소문자의 구분이 필요한 경우는 like를 사용하여 각각 or로 묶어 지정하자.
  • 데이터셋을 확인했을 때 단순히 우유와 요거트로만 나눠져 있어서 편하게 in으로 묶음
  1. group by를 통해 cart_id로 묶고
    = 동일한 cart_id로 name행이 합쳐짐.
    group by cart_id

  2. 우유와 요거트가 '모두' 있는 cart_id만 남기기
    : '모두' 있다 == name의 갯수가 2개(우유,요거트) == count(name)=2
    단, 하나의 품목을 여러번 구매했을 수 있으므로 distinct를 통해 중복을 제거해야함.
    having count (distinct name) = 2

profile
데이터분석 공부하는 비전공자

0개의 댓글