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

kiki·2024년 1월 2일
0

프로그래머스

목록 보기
35/76

문제 링크

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

문제 설명

  • 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력
  • 회원 ID를 기준으로 오름차순 정렬, 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬

1차 시도

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

HAVING은 GROUP BY에 조건을 걸어주는 것.
근데 이렇게 하면 USER_ID로 그룹이 묶이고 HAVING문에서는 그저 행 갯수를 카운트 하는거라서 의미가 없음.
내가 의도한건 USER_ID 별로 각 PRODUCT_ID 별 COUNT였음.
문제에서 의도한 것 처럼 같은 사용자가 같은 물건을 구매한 횟수를 세려면 아래와 같이 USER_ID, PRODUCT_ID 두개로 그룹화를 해줘야한다.

2차 시도

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

이렇게 해야 같은 사용자가 같은 물건을 구매한 횟수를 COUNT해 조회할 수 있음
여기서 COUNT는 PRODUCT_ID가 아니라 USER_ID여도 된다.

정리

  • HAVING: GROUP BY 후에 조건을 걸어주는 것. 즉 여기서는 USER_ID, PRODUCT_ID로 그룹화하고 각 그룹에서 PRODUCT_ID의 COUNT가 2 이상(재구매)인 경우만을 조회
  • GROUP BY 여러개: 이건 여러 속성이 중복되는 경우를 그룹화하고 COUNT와 같은 계산을 해주기 위해 사용됨.
    • 이 문제에선 동일한 구매자가, 동일한 물건을 재구매한 경우를 조회해야하니 구매자와 물건 ID를 그룹화해서 한 구매자가 같은 상품을 구매한 횟수를 COUNT 하는 것

      개발새발이지만 이런식으로 (1,3),(1,4),(2,4),(3,5)으로 묶이고 각 그룹에서 해당 조합이 반복된 수를 구하기 위해 PRODUCT_ID를 COUNT 해주면 구매 횟수를 구할 수 있다.

0개의 댓글