프로그래머스 53번
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.
📌 문제의 핵심은 :
- 동일한 회원이 동일한 상품을 재구매한 데이터
- 회원 id 와 상품 id 출력
- 회원 id 기준 오름차순, 상품 id 기준 내림차순 정렬
순차적으로 생각을 해보자!!
우선, 예약어 작동 순서를 명시해 본다.
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
- online_sale 테이블에서
SELECT *, COUNT(1)
FROM online_sale
GROUP BY user_id
ORDER BY 1 ASC;
-- 위와 같이 코드를 작성하면 아래와 같이 결과가 나온다!!

아래에 쭉 결과값이 나오는데, 해석을 해보면...
- user_id 가 2인 회원이 count(1)을 보면 3이라는 것은 상품을 3번 구매했다는 뜻.
- 하지만, 이것만으로는 동일한 상품을 구매했는지는 알 수 없음
- 따라서 group by 절에 product_id 로도 같이 묶어줘야 함. 그 결과를 보면
SELECT *, count(1)
FROM online_sale
group by user_id, product_id
ORDER BY user_id;
이렇게 까지 그룹화를 걸어주면, 동일한 회원이 동일한 상품을 '몇 번' 구매했는지 확인할 수가 있다.
- 문제에 있듯이 재구매한 모든 경우를 불러오는 것이므로,
- group by 아래에 having 조건절을 추가하여 필터를 해주고, 정렬을 하면 :
SELECT user_id
, product_id
FROM online_sale
GROUP BY user_id, product_id
HAVING COUNT(*) > 1
ORDER BY 1 ASC, 2 DESC;
-- 아래와 같이 결과가 나온다.

GROUP BY 절에 2개의 컬럼이 들어가야 하는 문제를 오랜만에 만나서 어색하고 어려운 부분이 있었던 것 같다. 그리고 '동일한 회원이 동일한 상품을 구매' 라는 조건에서 어떻게 뽑아내야 할지 떠오르지 않았다...
논리를 잘 생각해보고 주석을 달면서 차근히 풀어가자!!