[SQL] Programmers - 년, 월, 성별 별 상품 구매 회원 수 구하기 <GROUP BY, INNER JOIN, COUNT>

2023. 4. 7. 21:26공부/SQL

Problem

 

Solution

USER_INFO 테이블과 ONLINE_SALE 테이블은 USER_ID로 JOIN을 하면 문제를 쉽게 해결 할 수 잇을것 같다.

SELECT * 
FROM USER_INFO u
INNER JOIN ONLINE_SALE o ON u.USER_ID = o.USER_ID

JOIN 된 테이블

이제 이 테이블에서 년, 월, 성별 별로 상품을 구매한 회원의 숫자를 출력해야한다. 이 말은 GROUP BY YEAR, MONTH, GENDER 이라고 해석하면 된다. 여기까진 매우 쉽다.

SELECT 
YEAR(o.SALES_DATE) AS YEAR,
MONTH(o.SALES_DATE) AS MONTH,
u.GENDER,
COUNT(DISTINCT(o.USER_ID))
FROM USER_INFO u
INNER JOIN ONLINE_SALE o ON u.USER_ID = o.USER_ID
GROUP BY YEAR, MONTH, GENDER

 

출력 결과를 보면 GENDER 가 비어있는데 NULL 값을 제외해주는 조건을 추가해야겠다. 그리고 COUNT(DISTINCT(o.USER_ID)) 에서 DISTINCT() 함수를 사용한 것은 중복된 회원을 없애야 정확한 유저의 숫자를 알 수 있기 때문인데 이는 문제에서 원하는 답에 따라 다를 수 있겠다. 

WHERE GENDER IS NOT NULL

 정렬도 간단하게

ORDER BY YEAR, MONTH, GENDER;

추가해주면 끝날것 같다. 

SELECT 
    YEAR(SALES_DATE) AS YEAR, 
    MONTH(SALES_DATE) AS MONTH, 
    u.GENDER,
    COUNT(DISTINCT(o.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, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER;

 

성공