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

다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블 입니다. ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.

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

재구매가 일어난 상품과 회원 리스트 구하기Lv.2

131536

https://school.programmers.co.kr/learn/courses/30/lessons/131536

해설

ONLINE_SALE 테이블에서 특정 조건을 만족하는 데이터를 조회하는 데 사용됩니다.

  • Name
    SELECT 절
    Type
    Description
    • 결과 출력을 위해서 SELECT USER_ID, PRODUCT_ID FROM (...) AS SUBQUERY 사용합니다.
  • Name
    서브쿼리 (Subquery)
    Type
    Description

    가장 중요한 부분입니다. ONLINE_SALE 테이블에서 USER_ID와 PRODUCT_ID에 따라 그룹화(group by)를 하고, 각 그룹의 레코드 수를 세어 COUNT라는 별칭으로 표시한 서브 쿼리 작성이 필요합니다.

  • Name
    HAVING
    Type
    Description

    HAVING COUNT() > 1은 GROUP BY를 통해 형성된 그룹 중에서 레코드 수(COUNT())가 1보다 큰 그룹만을 선택합니다. 즉, 동일한 USER_ID와 PRODUCT_ID를 가진 레코드가 2개 이상인 경우에만 해당 그룹을 결과에 포함시킵니다.

  • Name
    ORDER BY
    Type
    Description

    ORDER BY USER_ID ASC, PRODUCT_ID DESC는 결과를 정렬하는 데 사용됩니다.

결과적으로, 이 쿼리는 ONLINE_SALE 테이블에서 같은 사용자(USER_ID)가 동일한 제품(PRODUCT_ID)을 2번 이상 구매한 경우에 대한 USER_ID와 PRODUCT_ID를 조회하고, 이를 사용자 ID 순으로 오름차순 정렬하며, 같은 사용자 ID 내에서는 제품 ID 순으로 내림차순 정렬하여 반환합니다.

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

SELECT
    USER_ID, PRODUCT_ID
FROM
    (SELECT
        USER_ID, PRODUCT_ID, COUNT(*) AS COUNT
    FROM
        ONLINE_SALE
    GROUP BY
        USER_ID, PRODUCT_ID
    HAVING COUNT(*) > 1) AS SUBQUERY
ORDER BY
    USER_ID ASC, PRODUCT_ID DESC