-
<프로그래머스> 우유와 요거트가 담긴 장바구니코딩테스트/SQL 코딩테스트 2023. 12. 28. 16:57
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/62284
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 문제 요구사항
- 우유(Milk)와 요거트(Yogurt)를 동시에 구매한 장바구니의 ID를 조회
- 이 때 결과는 장바구니 ID 순으로 출력
NAME의 값이 다중값이 아닌 단일 값으로 구성되어 있어 한 장바구니에서 여러 물건을 주문했다면 주문한 물건의 숫자 만큼의 행이 존재하는 형식의 데이터이다.
장바구니에 대한 조건은 우유와 요거트를 각 각 몇개를 구매하던 상관없이 둘 다를 모두 한 번에 구매한 장바구니이다.
데이터를 조회했을 때 요거트만 2개 구매하고 우유는 구매하지 않은 장바구니도 존재하기 때문에 단순히 OR 조건으로 조회했을 때 행의 숫자가 2개보다 많은 조건으로 조회하면 오답 처리가 된다.
FROM절 서브쿼리를 이용해서 요거트 혹은 우유를 구매한 사람의 장바구니 ID와 물건 이름을 조회하되
장바구니 ID와 물건 이름을 기준으로 GROUP BY한다.
이렇게 되면 몇개를 구매했건 우유 혹은 요거트 둘 중 하나만 구매한 장바구니의 경우 행의 수가 1개, 둘 다 하나 씩 혹은 그 이상 구매한 경우는 행의 개수가 2개가 나온다.
이렇게 구해진 서브쿼리를 테이블로 하여 다시 장바구니를 기준으로 GROUP BY를 하고
HAVING 조건으로 COUNT(*)가 2개인 장바구니의 ID를 조회하면 문제 해결이다.
1) Oracle
SELECT CART_ID FROM ( SELECT CART_ID, NAME FROM CART_PRODUCTS WHERE NAME='Yogurt' OR NAME='Milk' GROUP BY CART_ID, NAME ) A GROUP BY CART_ID HAVING COUNT(*) = 2 ORDER BY CART_ID;
2) MySQL
SELECT CART_ID FROM ( SELECT CART_ID, NAME FROM CART_PRODUCTS WHERE NAME='Yogurt' OR NAME='Milk' GROUP BY 1, 2 ) A GROUP BY 1 HAVING COUNT(*) = 2 ORDER BY 1;
'코딩테스트 > SQL 코딩테스트' 카테고리의 다른 글
<프로그래머스> 주문량이 많은 아이스크림 조회하기 (1) 2023.12.28 <프로그래머스> 조회수가 가장 많은 중고거래 게시판 첨부파일 조회하기 (0) 2023.12.28 <프로그래머스> 헤비 유저가 소유한 장소 (0) 2023.12.28 <프로그래머스> 자동차 평균 대여 기간 구하기 (0) 2023.12.28 <프로그래머스> 년, 월, 성별 별 상품 구매 회원 수 구하기 (2) 2023.12.22 - 문제 요구사항