https://school.programmers.co.kr/learn/courses/30/lessons/131532
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드
SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, UI.GENDER AS GENDER, COUNT(DISTINCT UI.USER_ID) AS USERS
FROM USER_INFO AS UI JOIN ONLINE_SALE AS OS ON UI.USER_ID = OS.USER_ID
WHERE UI.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER
쿼리 실행 순서
실행 순서 SQL 절 설명
1️⃣ | FROM | USER_INFO(UI)와 ONLINE_SALE(OS)을 JOIN하여 데이터를 가져옴 |
2️⃣ | WHERE | UI.GENDER IS NOT NULL 조건을 만족하는 데이터만 필터링 |
3️⃣ | GROUP BY | YEAR, MONTH, GENDER 기준으로 그룹화 |
4️⃣ | SELECT | YEAR, MONTH, GENDER, COUNT(DISTINCT UI.USER_ID) AS USERS 선택 |
5️⃣ | ORDER BY | YEAR, MONTH, GENDER 기준으로 정렬 |
첫 풀이를 아래와 같이 제출했다.
오답 풀이
SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, UI.GENDER AS GENDER, COUNT(*) AS USERS
FROM USER_INFO AS UI JOIN ONLINE_SALE AS OS ON UI.USER_ID = OS.USER_ID
WHERE UI.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER
결과는 앞에서 얘기했듯이 오답이었다.
지금부터 이유를 알아보자 아래는 지문의 일부이다.
ONLINE_SALE 테이블이 다음과 같다면
ONLINE_SALE_ID USER_ID PRODUCT_ID SALES_AMOUNT SALES_DATE
1 | 1 | 54 | 1 | 2022-01-01 |
2 | 1 | 3 | 2 | 2022-01-25 |
3 | 4 | 34 | 1 | 2022-01-30 |
4 | 6 | 253 | 3 | 2022-02-03 |
5 | 2 | 31 | 2 | 2022-02-09 |
6 | 5 | 35 | 1 | 2022-02-14 |
7 | 5 | 57 | 1 | 2022-02-18 |
2022년 1월에 상품을 구매한 회원은 USER_ID 가 1(GENDER=1), 4(GENDER=0)인 회원들이고,
2022년 2월에 상품을 구매한 회원은 USER_ID 가 2(GENDER=NULL), 5(GENDER=1), 6(GENDER=1)인 회원들 이므로,
년, 월, 성별 별로 상품을 구매한 회원수를 집계하고, 년, 월, 성별을 기준으로 오름차순 정렬하면 다음과 같은 결과가 나와야 합니다.
지문의 내용을 해석하면 문제의 요구사항은 같은 달에 여러 개의 물건을 구매한 회원은 DISTINCT로 구분해야한다는 것이었다.
따라서 COUNT(*) → COUNT(DISTINCT UI.USER_ID)로 수정해주었다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스 SQL] 고양이와 개는 몇 마리 있을까 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |
---|---|
[프로그래머스 SQL] 동명 동물 수 찾기 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |
[프로그래머스 SQL] 입양 시각 구하기(1) - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |
[프로그래머스 SQL] CASE와 WHERE 차이점과 용도 (0) | 2025.03.02 |
[프로그래머스 MySQL] 가격대 별 상품 개수 구하기 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |