티스토리 뷰

SMALL

문제 설명

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

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

 

Column name Type Nullable
ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

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

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

예시

예를 들어 ONLINE_SALE 테이블이 다음과 같다면

ONLINE_SALE_ID USER_ID PRODUCT_ID SALES_AMOUNT SALES_DATE
1 1 3 2 2022-02-25
2 1 4 1 2022-03-01
4 2 4 2 2022-03-12
3 1 3 3 2022-03-31
5 3 5 1 2022-04-03
6 2 4 1 2022-04-06
2 1 4 2 2022-05-11

USER_ID 가 1인 유저가 PRODUCT_ID 가 3, 4인 상품들을 재구매하고, USER_ID 가 2인 유저가 PRODUCT_ID 가 4인 상품을 재구매 하였으므로, 다음과 같이 결과가 나와야합니다.

USER_ID PRODUCT_ID
1 4
1 3
2 4

풀이 과정

일단 동일 상품을 재구매했다는 것은 USER_ID와 PRODUCT_ID가 동일한 행이 다수라는 뜻이다.

  1. 사용자가 재구매한 데이터 찾기
    → 이 그룹화된 데이터의 행이 1보다 크다면 한 사용자가 동일 상품을 재구매했다는 뜻이 된다. HAVING 절을 통해 그룹화된 결과에 조건을 적용할 수 있고, COUNT 함수로 개수를 셀 수 있다.
    GROUP BY 절로 USER_ID, PRODUCT_ID로 데이터를 그룹화 하면 동일한 사용자, 동일한 상품에 대해 여러 레코드를 하나의 그룹으로 묶을 수 있다.
  2. 회원 ID를 기준으로 오름차순 정렬과 상품 ID를 기준으로 내림차순 정렬
    → ORDER BY 절을 사용하는데, 여러 개의 컬럼을 정렬할 때에는 각 컬럼을 , 로 구분하여 작성한다. 내림차순 정렬 시에는 DESC를 붙인다.

정답 쿼리

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

배운 점

  • GROUP BY 컬럼명 → 컬럼 값 같은 것끼리 그룹화 시켜준다.
  • HAVING → GROUP BY로 그룹화된 데이터에 조건 적용할 때 사용 (WHERE는 개별 레코드를 필터링하는데 사용)
  • COUNT → SQL의 집계 함수, 특정 조건에 맞는 행의 개수를 계산할 때 사용한다. *은 모든 열을 의미하기 때문에 COUNT(*)은 그룹화된 데이터에서 모든 행을 센다.
LIST
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함