📍 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📍 풀이
고려해야할 조건들을 살펴보자!
1. 년, 월, 성별 별로 상품을 구매한 회원수를 집계
2. 년, 월, 성별을 기준으로 오름차순 정렬
3. 성별 정보가 없는 경우 결과에서 제외
1. GROUP BY 활용하여 년, 월, 성별 별로 상품을 구매한 회원수를 집계
GROUP BY YEAR, MONTH, GENDER
2. ORDER BY 활용하여 년, 월, 성별을 기준으로 오름차순 정렬
ORDER BY YEAR, MONTH, GENDER
3. IS NOT NULL 활용하여 성별 정보가 없는 경우 결과에서 제외
WHERE U.GENDER IS NOT NULL
이렇게 모든 조건을 잘 생각해서 잘 쓴 것 같았는데,,,,,
❌ 틀린 코드 ❌
SELECT YEAR(O.SALES_DATE) AS YEAR, MONTH(O.SALES_DATE) AS MONTH, U.GENDER, COUNT(O.USER_ID) AS USERS
FROM USER_INFO AS U
JOIN ONLINE_SALE AS O
ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER
오류가 뜨는 것도 아니고 도대체 어디때문에 틀린 건지 몰랐다...
결국 다른 분들이 푼 정답 코드를 보면서 깨달았다.
딱 하나를 안 써서 틀렸는데,,
DISTINCT
로 중복 제거를 안 해 줘서 틀렸던 것이다.
상품을 구매한 회원 수를 집계하는 것이고 ONLINE_SALE 테이블에는 판매 정보를 담고 있어 USER_ID가 중복되는 데이터들이 있다.
=> ⭐⭐ DISTINCT를 써서 중복 제거해 주어야 함! ⭐ ⭐
📍 정답 코드
SELECT YEAR(O.SALES_DATE) AS YEAR, MONTH(O.SALES_DATE) AS MONTH, U.GENDER, COUNT(DISTINCT O.USER_ID) AS USERS
FROM USER_INFO AS U
JOIN ONLINE_SALE AS O
ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER