프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
JOIN과 GROUP BY를 활용하면 되는 어렵지 않은 문제지만, 사소한 부분을 실수해서 다시 이런 실수를 하지 않기 위해 글을 작성한다.
처음에 이런 코드를 작성했다.
SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, GENDER, COUNT(USER_INFO.USER_ID) AS USERS
FROM USER_INFO JOIN ONLINE_SALE ON USER_INFO.USER_ID = ONLINE_SALE.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
ORDER BY 1, 2, 3
손쉽게 코드를 작성하고 제출하니 틀렸습니다가 계속나왔다.
도대체 뭐가 오류인지 모르겠어서 실눈뜨고 풀이보기 방법으로 오류를 찾았다.
동일한 날짜, 회원ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
문제에 있는 이 문구를 보고 DISTINCT를 걸어줄 필요가 없다고 생각했다.
하지만 DISTINCT를 걸지 않고 count를 할 경우에는 중복된 USER_ID를 count하는 문제가 발생했다.
예를 들어,
여기 있는 데이터를 보자.
맨 왼쪽에 있는 숫자들이 USER_ID이고, 오른쪽 날짜가 SALES_DATE(상품 구매 날짜)이다.
여기서 GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
을 통해 년,월, 성별 별 구매한 회원수를 DISTINCT를 걸지 않고 count하면,
이런 식으로 나온다.
그런데 2022년 3월에 상품을 구매한 GENDER가 0인 회원은 USER_ID가 68, 126, 103인 경우이다.
USER_ID가 68인 회원이 2번 구매하는데 해당 경우를 모두 세버려서 올바른 답인 3이 아니라 4가 나오는 것이다.
그런데 위에서
동일한 날짜, 회원ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
라는 문구가 있었다. 이것 땜에 DISTINCT를 걸지 않아도 되지 않나? 라는 생각을 했었는데
위 문구의 뜻은 동일한 날짜, 회원 ID, 상품ID 조합에 대해서 하나의 판매 데이터가 존재한다는 것이므로 서로 다른 SALES_DATE, USER_ID, PRODUCT_ID 에 대해서 하나의 판매 데이터가 존재한다는 것이지,
다른 날짜에 같은 회원이 상품을 구매하는 것은 가능하다.
이 경우 때문에 USER_ID에 DISTINCT를 걸어서 COUNT를 해주면 올바른 답이 나온다.
올바른 답
SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, GENDER, COUNT(DISTINCT USER_INFO.USER_ID) AS USERS
FROM USER_INFO JOIN ONLINE_SALE ON USER_INFO.USER_ID = ONLINE_SALE.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
ORDER BY 1, 2, 3
문제를 잘 읽도록 하자.
참고
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'알고리즘 > SQL' 카테고리의 다른 글
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.07.16 |
---|---|
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.07.11 |
[프로그래머스] 특정 세대의 대장균 찾기 (0) | 2024.07.09 |
[프로그래머스] 입양 시각 구하기(2) (0) | 2024.07.08 |
[프로그래머스] 우유와 요거트가 담긴 장바구니 (0) | 2024.07.01 |