티스토리 뷰
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보다 크다면 한 사용자가 동일 상품을 재구매했다는 뜻이 된다. HAVING 절을 통해 그룹화된 결과에 조건을 적용할 수 있고, COUNT 함수로 개수를 셀 수 있다.
→ GROUP BY 절로 USER_ID, PRODUCT_ID로 데이터를 그룹화 하면 동일한 사용자, 동일한 상품에 대해 여러 레코드를 하나의 그룹으로 묶을 수 있다. - 회원 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
'Algorithm' 카테고리의 다른 글
백준 1504번: 특정한 최단 경로 (G4) - Python 풀이 (0) | 2025.03.06 |
---|---|
백준 1446번: 지름길 (S1) - Python 풀이 (0) | 2025.03.05 |
프로그래머스 Lv.2: 3월에 태어난 여성 회원 목록 출력하기 - MySQL 풀이 (0) | 2025.02.28 |
백준 11053번: 가장 긴 증가하는 부분 수열 (S2) - Python 풀이 (0) | 2025.02.26 |
백준 2293번: 동전 1 (G4) - Python 풀이 (0) | 2025.02.25 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자료구조
- 힙
- SQL
- 코테준비
- BFS
- Deque
- 이분탐색
- 코딩테스트
- 알고리즘
- MySQL
- swea
- ios
- Baekjoon
- 투포인터
- 다이나믹프로그래밍
- 프로그래머스
- 그리디
- ios앱개발
- 백준
- 코테
- Python
- 스택
- Swift
- 정렬
- Swift로백준풀기
- 큐
- 우선순위큐
- Programmers
- dp
- 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함