https://school.programmers.co.kr/learn/courses/30/lessons/62284
코딩테스트 연습 - 우유와 요거트가 담긴 장바구니
알고리즘 문제 연습 카카오톡 친구해요! 프로그래머스 교육 카카오 채널을 만들었어요. 여기를 눌러, 친구 추가를 해주세요. 신규 교육 과정 소식은 물론 다양한 이벤트 소식을 가장 먼저 알려
school.programmers.co.kr
📚 문제
CART_PRODUCTS 테이블에서 Yogurt와 Milk가 모두 포함된 CART_ID를 조회하는 SQL 쿼리를 작성해주세요. 결과는 CART_ID를 기준으로 오름차순 정렬해주세요.
✏️ 내 풀이 (오답)
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Yogurt', 'Milk')
GROUP BY CART_ID
HAVING COUNT(NAME) >= 2
ORDER BY 1
이 쿼리는 Yogurt와 Milk가 모두 포함된 장바구니를 찾는 대신, Yogurt나 Milk가 포함된 행의 개수가 2개 이상인 장바구니를 반환한다.
예를 들어, 한 장바구니에 Yogurt가 2개 있거나 Milk가 2개 있는 경우도 결과에 포함한다. 이는 문제의 의도(두 제품이 모두 포함되어야 함)와 맞지않다.
예시 데이터
CART_ID | NAME
--------|-------
1 | Yogurt
1 | Milk
2 | Yogurt
2 | Yogurt
3 | Milk
3 | Milk
4 | Yogurt
4 | Milk
- CART_ID = 2: Yogurt 2개 → COUNT(NAME) = 2 → 결과에 포함 (의도와 다름)
- CART_ID = 3: Milk 2개 → COUNT(NAME) = 2 → 결과에 포함 (의도와 다름)
✏️ 좋은 풀이
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Yogurt', 'Milk')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY 1
풀이 설명
- WHERE NAME IN ('Yogurt', 'Milk'): Yogurt와 Milk만 필터링.
- GROUP BY CART_ID: 장바구니별로 데이터를 그룹화.
- HAVING COUNT(DISTINCT NAME) = 2: 각 장바구니에서 고유한 제품 이름의 개수가 정확히 2개(Yogurt와 Milk)인 경우만 선택. DISTINCT를 사용해 중복된 제품 이름을 제거하므로, 한 장바구니에 Milk가 여러 개 있어도 고유 이름은 Milk 하나로 계산.
- ORDER BY 1: CART_ID를 오름차순 정렬.
✒️ 회고
- GROUP BY를 사용할 때는 중복된 데이터가 결과에 어떻게 영향을 미치는지 항상 고려해야 겠다
- 특히, COUNT를 사용할 때 DISTINCT를 활용하면 중복을 제거해 정확한 집계를 해야한다.
'코딩테스트 > SQL' 카테고리의 다른 글
[MySQL]년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2025.04.14 |
---|---|
[MySQL] 없어진 기록 찾기 (0) | 2025.04.11 |
[MySQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2025.04.10 |
[Mysql] 가격대 별 상품 개수 구하기 (0) | 2025.04.07 |
[SQL]NULL 처리하기 (0) | 2025.03.07 |