본문 바로가기

프로그래머스 문제

프로그래머스 SQL 문제(재구매가 일어난 상품과 회원리스트)

문제 이름:

재구매가 일어난 상품과 회원리스트 조회

 

문제 설명:

ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 
재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 
결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

 

오답노트:

 

처음에 쓴 풀이

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY 1, 2
HAVING COUNT(USER_ID) = 2
AND COUNT(USER_ID) = 2
ORDER BY 1 ASC, 2 DESC

 

이렇게 풀어서 제출을 했더니 틀렸다고 나왔다. 처음엔 무엇이 잘 못 되었는지 몰라서

GROUP BY에서 문제가 생겼나 싶어서 GROUP BY에 대해서 찾아보고 했는데 

아무리 찾아봐도 GROUP BY에는 문제가 생길 수 가 없다고 판단했다.

그래서 문제 설열을 다시 가만히 보니 문제가 무었이었는지 알아차렸다.

 

재구매가 일어난 것을 조회하는 것인데 위의 코드에는 2번 구매한 것만을 조회하고 있었다.

이 문제를 바로 쓴 코드가 아래의 코드이다.

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE 
GROUP BY 1, 2
HAVING COUNT(USER_ID) >= 2
AND COUNT(PRODUCT_ID) >= 2
ORDER BY 1 ASC , 2 DESC

 

HAVING절에서 재구매건이 2이상인 것을 조회하도록 바꾸어 주었다.

이렇게 해서 제출을 하니 정답이라고 떴다.

 

 

풀이 :

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE 
GROUP BY 1, 2
HAVING COUNT(USER_ID) >= 2
AND COUNT(PRODUCT_ID) >= 2
ORDER BY 1 ASC , 2 DESC

 

  1. 회원ID랑 상품ID를 조회하라고 했으니 SELECT USER_ID, PRODUCT_ID 를 해준다.
  2. ONLINE_SALE의 테이블에서 가지고 오니 FROM ONLINE_SALE 을 해준다.
  3. GROUP BY로 회원ID랑 상품ID별로 묶어준다 이렇게 하면 회원ID의 같은 값이랑 상품ID의 같은 값만 묶는다.
    (회원ID          상품ID     -->      회원ID          상품ID)
         1                    2                        1                    2
         1                    2                        1                    3
         1                    3
  4. HAVING절에서 COUNT(USER_ID) >= 2와 COUNT(PRODUCT_ID) > = 2로 회원ID와 상품ID의 중복된 값을
    COUNT해주고 그것이 2이상인 것을 조회한다.
  5. 마지막 ORDER BY로 회원ID를 기준으로 오름차순으로 정렬하고
    회원ID가 같다면 상품ID를 기준으로 내림차순으로 정렬한다.