728x90
📚문제
📝풀이
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
'SQL > 프로그래머스 SQL 고득점 kit' 카테고리의 다른 글
SQL 고득점 Kit / 가격대 별 상품 개수 구하기 / MySQL (0) | 2023.10.31 |
---|---|
SQL 고득점 Kit / 입양 시각 구하기(2) / MySQL (변수선언 , SELECT문 서브쿼리) (0) | 2023.10.31 |
SQL 고득점 Kit / GROUP BY / 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 / MySQL (0) | 2023.10.27 |
SQL 고득점 kit / GROUP BY / 즐겨찾기가 가장 많은 식당 정보 출력하기 / MySQL (GROUP BY, 서브쿼리) (0) | 2023.10.26 |
SQL 고득점 Kit / SELECT / 오프라인-온라인 판매 데이터 통합하기 / MySQL (0) | 2023.10.20 |