문제 풀이/SQL

[programmers] [SQL/MySQL] 재구매가 일어난 상품과 회원 리스트 구하기

일 월 2023. 3. 4. 23:10

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

 

프로그래머스

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

programmers.co.kr


문제 설명

의류 쇼핑몰의 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블 

 

Column   nameType Nullable
ONLINE_SALE_ID 온라인 상품 판매 ID INTEGER FALSE
USER_ID 회원 ID INTEGER FALSE
PRODUCT_ID 상품 ID INTEGER FALSE
SALES_AMOUNT 판매량 INTEGER FALSE
SALES_DATE 판매일 DATE FALSE

 

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

 

문제

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

 

결과 예시

USER_ID PRODUCT_ID
1 4
1 3
2 4

고려 사항

1. COUNT 함수

 

개수를 구하는 함수

COUNT(개수를 구할 컬럼명) 또는 COUNT(*) 형태로 작성하는데, COUNT 함수 안에 컬럼명을 넣을 경우 그 컬럼 값이 NULL일 경우, 그 행은 제외하고 계산된다.

# ONLINE_SALE 테이블의 데이터(행) 개수
SELECT COUNT(*) FROM ONLINE_SALE;

# USER_ID가 1인 회원의 총 구매 횟수
SELECT COUNT(*) FROM ONLINE_SALE WHERE USER_ID = 1;

 

2. GROUP BY

 

특정 데이터 기준으로 묶어서 처리하고 싶을 때 사용 (중복 제거를 할 때도 유용)

# 구매이력이 있는 USER_ID
SELECT USER_ID FROM ONLINE_SALE GROUP BY USER_ID;

# 판매이력이 있는 PRODUCT_ID
SELECT PRODUCT_ID FROM ONLINE_SALE GROUP BY PRODUCT_ID;

# USER_ID별 구매한 상품(PRODUCT_ID) 목록
SELECT USER_ID, PRODUCT_ID FROM ONLINE_SALE GROUP BY USER_ID, PRODUCT_ID;

# USER_ID별 구매한 상품(PRODUCT_ID) 목록과 USER_ID별 상품 구매 횟수
SELECT USER_ID, PRODUCT_ID, COUNT(*) FROM ONLINE_SALE GROUP BY USER_ID, PRODUCT_ID;

# USER_ID별 구매한 상품(PRODUCT_ID) 목록과 USER_ID별 상품 총 구매량
SELECT USER_ID, PRODUCT_ID, SUM(SALES_AMOUNT) FROM ONLINE_SALE GROUP BY USER_ID, PRODUCT_ID;

 

3. GROUP BY 사용 시, WHERE과 HAVING 차이

 

WHERE : 전체 테이블 중 개별 행에 대한 조건, GROUP BY 실행 전에 조건 적용

HAVING : 그룹 각각에 대한 조건, GROUP BY 실행 결과 행에 조건 적용

# 판매량이 2 이상인 구매 건이 존재하는 PRODUCT_ID
# 그룹화 전, 판매량이 1 이하인 구매 목록은 제외
SELECT PRODUCT_ID FROM ONLINE_SALE WHERE SALES_AMOUNT >= 2
GROUP BY PRODUCT_ID;

# 총 판매량이 2 이상인 PRODUCT_ID
# 그룹화 후, 판매량의 총합이 1 이하인 그룹 제외
SELECT PRODUCT_ID FROM ONLINE_SALE
GROUP BY PRODUCT_ID HAVING SUM(SALES_AMOUNT) >= 2;

 

 

풀이

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

 


참고

https://dlagusgh1.tistory.com/365

 

MySQL COUNT(*) 갯수 출력

# COUNT(*) 갯수 출력 특정 테이블에서 특정 조건에 맞는 컬럼의 갯수 등을 출력하고자 할때 사용 정석 SELECT COUNT(*) AS CNT 여기서 AS는 생략 가능하다. cnt는 별칭 or 별명 or 이름을 의미한다. SELECT COUNT

dlagusgh1.tistory.com

https://gent.tistory.com/505

 

[MSSQL] GROUP BY 절 사용법 (그룹별 집계)

SQL Server에서 GROUP BY 절은 특정 칼럼을 기준으로 집계 함수를 사용하여 건수(COUNT), 합계(SUM), 평균(AVG) 등 집 계성 데이터를 추출할 때 사용한다. GROUP BY 절에서 기준 칼럼을 여러 개 지정할 수 있으

gent.tistory.com

https://extbrain.tistory.com/54

 

[MySQL] 데이터 갯수 가져오기 (COUNT 함수)

▶MySQL 데이터 갯수 가져오기 (COUNT 함수) ▶설명 테이블에 존재하는 데이터 갯수를 가져오고 싶을 때가 있습니다.이 때 사용하는 함수가 COUNT 함수입니다.COUNT 함수는 테이블에 컬럼의 데이터 갯

extbrain.tistory.com

https://wansook0316.github.io/cs/database/2020/04/25/where-having-%EC%B0%A8%EC%9D%B4.html

 

[SQL] where와 having의 차이 | 완숙의 에그머니🍳

Be On My Wave 🌊 | 뚜렷한 목표, 치밀한 계획, 우직한 실천

wansook0316.github.io

https://learn.microsoft.com/ko-kr/sql/ssms/visual-db-tools/use-having-and-where-clauses-in-the-same-query-visual-database-tools?view=sql-server-ver16 

 

동일한 쿼리에서 HAVING 및 WHERE 절 사용 - Visual Database Tools

동일한 쿼리에서 HAVING 및 WHERE 절 사용(Visual Database Tools)

learn.microsoft.com