MySQL 프로그래머스 | 재구매가 일어난 상품과 회원리스트 구하기

    728x90

     

    문제

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

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    • ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성
    • 회원 ID 기준 오름차순, 회원 ID가 같다면 상품 ID 기준 내림차순 정렬
    • 쿼리 결과 : USER_ID, PRODUCT_ID

     

    테이블

    ONLINE_SALE

     

     

    풀이과정

    (1) 각 USER_ID 별 구매한 PRODUCT_ID 개수를 세는 CNT_PRO 컬럼 만들기

    1
    2
    3
    SELECT USER_ID, PRODUCT_ID, COUNT(PRODUCT_ID) CNT_PRO
    FROM ONLINE_SALE
    GROUP BY 1,2
    cs

     

    (2) 각 USER_ID 별 재구매 PRODUCT_ID 구하기 (CNT_PRO가 1 초과인 행만 추출)

    1
    2
    3
    4
    5
    6
    SELECT USER_ID, PRODUCT_ID
    FROM
    (SELECT USER_ID, PRODUCT_ID, COUNT(PRODUCT_ID) CNT_PRO
    FROM ONLINE_SALE
    GROUP BY 1,2) UC
    WHERE CNT_PRO > 1
    cs

     

    # 정답

    ORDER BY 절에 정렬 기준까지 잘 작성해주면 끝!

    1
    2
    3
    4
    5
    6
    7
    SELECT USER_ID, PRODUCT_ID
    FROM
    (SELECT USER_ID, PRODUCT_ID, COUNT(PRODUCT_ID) CNT_PRO
    FROM ONLINE_SALE
    GROUP BY 1,2) UC
    WHERE CNT_PRO > 1
    ORDER BY 12 DESC
    cs

     

     

    다른 풀이

    USER_ID와 PRODUCT_ID로 그룹화 해준 뒤, USER_ID가 두 번 이상 카운트 된 행 찾기

    1
    2
    3
    4
    5
    SELECT OS1.USER_ID, OS1.PRODUCT_ID
    FROM ONLINE_SALE AS OS1
    GROUP BY 1,2
    HAVING COUNT(USER_ID) >= 2
    ORDER BY USER_ID, PRODUCT_ID DESC
    cs
    728x90

    댓글