[SQL]

Hyunjun Kim·2024년 10월 10일
0

SQL

목록 보기
15/44

문제 설명

다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 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를 기준으로 내림차순 정렬해주세요.

내 풀이

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

실행 결과

USER_ID PRODUCT_ID
15 12
15 12
119 12
119 12

정답

SELECT DISTINCT s1.USER_ID, s1.PRODUCT_ID
FROM ONLINE_SALE s1, ONLINE_SALE s2
WHERE s1.USER_ID = s2.USER_ID
and s1.PRODUCT_ID = s2.PRODUCT_ID
and s1.SALES_DATE != s2.SALES_DATE
ORDER BY 1,2 DESC

실행 결과
USER_ID PRODUCT_ID
15 12
119 12

다른 풀이

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

조건1) 알맞은 join 방식을 사용하여 users 테이블을 기준으로, payment 테이블을 조인해주세요.
조건2) case when 구문을 사용하여 결제를 한 유저와 결제를 하지 않은 게임계정을 구분해주시고, 컬럼이름을 gb로 지정해주세요.

조건3) gb를 기준으로 게임계정수를 추출해주세요. 컬럼 이름은 usercnt로 지정해주시고, 결과값은 아래와 같아야 합니다.

힌트: 기준이 되는 테이블의 데이터는 그대로 두어야겠죠?

SELECT CASE WHEN p.pay_amount is NULL THEN '결제안함'
WHEN p.pay_amount = 0 THEN '결제안함'
ELSE '결제함' END gb, COUNT(DISTINCT u.game_account_id) usercnt
FROM basic.users u LEFT JOIN basic.payment p
ON u.game_account_id = p.game_account_id
GROUP BY 1

ELSE '결제함' END gb, COUNT(DISTINCT u.game_account_id) usercnt 에서
u.game_account_id 를 헷갈려서 p.game_account_id로 적었다가 헤맸었다.

LEFT JOIN 이었기 때문에 당연히 값이 나오지 않았을텐데.
아직 join 개념이 잘 잡히지 않은 듯 함.

0개의 댓글