[프로그래머스] 우유와 요거트가 담긴 장바구니 - SQL

Donghyun·2024년 7월 23일
0

Code Kata - SQL

목록 보기
23/61
post-thumbnail

링크: https://school.programmers.co.kr/learn/courses/30/lessons/62284

문제 설명

CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. CART_PRODUCTS 테이블의 구조는 다음과 같으며, IDCART_IDNAMEPRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가격을 나타냅니다.

NAMETYPE
IDINT
CART_IDINT
NAMEVARCHAR
PRICEINT

데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.

예시

예를 들어 CART_PRODUCTS 테이블이 다음과 같다면

CART_PRODUCTS 테이블

IDCART_IDNAMEPRICE
163083Cereal3980
163183Multipurpose Supply3900
5491286Yogurt2980
5504286Milk1880
8435448Milk1880
8437448Yogurt2980
8438448Tea11000
202361034Yogurt2980
202371034Butter4890
  • 83번 장바구니에는 Milk와 Yogurt가 모두 없습니다.
  • 286번 장바구니에는 Milk와 Yogurt가 모두 있습니다.
  • 448번 장바구니에는 Milk와 Yogurt가 모두 있습니다.
  • 1034번 장바구니에는 Milk는 없고 Yogurt만 있습니다.

따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.

CART_ID


286


448


문제풀이

이번 문제는 같은 테이블에서 Join 하는 방법과 Subquery 를 사용하는 방법 이렇게 두 가지 방법으로 작성해봤다.

1. 같은 테이블 SELF JOIN - 테이블 내의 데이터가 서로 관련되어 있을 때 유용.

  • CART_PRODUCTS 테이블에서 CART_ID 를 기준으로 JOIN 할 건데 이 때 주의사항은 테이블에 별칭을 사용하여 같은 테이블의 서로 다른 인스턴스를 구분해야 한다.
  • WHERE 절을 사용하여 NAME 이 Milk, Yogurt 인 조건을 건다.
  • 그리고 CART_ID 를 SELECT 하고
  • 마지막으로 CART_ID 를 기준으로 오름차순 정렬하면 끝!
SELECT 
    a.CART_ID
FROM CART_PRODUCTS a
    INNER JOIN CART_PRODUCTS b
    ON a.CART_ID = b.CART_ID
    WHERE a.NAME = 'Milk' AND b.NAME = 'Yogurt'
ORDER BY 1

2. Subquery

  • (서브쿼리)WHERE 절에서 서브쿼리를 이용해 CART_ID 가 다음과 같아야 한다:
    • CART_PRODUCTS 테이블에서
    • NAME 이 Milk, Yogurt 인
    • CART_ID 를 조회하는 서브쿼리를 각각 만든다.
  • (메인쿼리)CART_PRODUCTS 에서
  • CART_ID 를 조회하고
  • CART_ID 를 기준으로 오름차순 정렬!
SELECT DISTINCT
    CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN (
    SELECT CART_ID 
    FROM CART_PRODUCTS
    WHERE NAME = "Yogurt"
) AND CART_ID IN (
    SELECT CART_ID 
    FROM CART_PRODUCTS
    WHERE NAME = "Milk"
)
ORDER BY 1 ASC;
profile
데이터분석 공부 일기~!

0개의 댓글