본문 바로가기

SQL/프로그래머스 SQL 고득점 kit

SQL 고득점 Kit / GROUP BY / 년,월,성별 별 상품 구매 회원 수 구하기 /MySQL

728x90

📚문제

출처 : 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/131532)

 

📝풀이

SELECT YEAR(O.SALES_DATE) AS YEAR
     , MONTH(O.SALES_DATE) AS MONTH
     , U.GENDER 
     , COUNT(DISTINCT U.USER_ID) AS USERS
FROM USER_INFO U
INNER JOIN ONLINE_SALE O ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR(O.SALES_DATE),MONTH(O.SALES_DATE),U.GENDER
ORDER BY YEAR(O.SALES_DATE),MONTH(O.SALES_DATE),U.GENDER

 

이 문제에서 중요한 포인트는 

COUNT(DISTINCT U.USER_ID) AS USERS

여기서 DISTINCT 를 해주는 것!

 

이 문장을 주는 이유를

생각해봤다

그렇다면

같은 날짜, 회원 ID, 상품 ID에 대해서는 당연히 1번의 판매기록 밖에 없을것이지만

같은 날짜, 회원 ID까지는 중복이 있을 수 있기 때문에

USER_ID에 중복제거를 해주어야 한다는 뜻

 

무슨 말이냐면

문제에서 주어진 예시를 들어보면

 

둘 다 1월에 구매한 내역이고

USER_ID가 1인 경우이다

(GENDER는 당연히 같을거고)

근데 이때 년,월,성별 별로 상품을 구매한 회원 수를 집계하는데(구매한 기록만 있으면 됨)

USER_ID의 중복을 제거해주지 않으면

USER_ID 1이 2번 들어가서

2명이 구매한 걸로 집계가 되버린다

 

(DISTINCT의 사용시기가 은근 헷갈린다..)

 


SELECT YEAR(O.SALES_DATE) AS YEAR
     , MONTH(O.SALES_DATE) AS MONTH
     , U.GENDER
     , COUNT(DISTINCT O.USER_ID) AS USERS
FROM ONLINE_SALE O
JOIN USER_INFO U ON O.USER_ID = U.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR(O.SALES_DATE), MONTH(O.SALES_DATE),U.GENDER
ORDER BY YEAR,MONTH,GENDER

풀이는 완전 동일하지만

이번에는 DISTINCT의 사용을 놓치지 않고 해주었다🤓

728x90