SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_년, 월, 성별 별 상품 구매 회원 수 구하기

SQL공부 2024. 2. 23. 20:58
반응형

SELECT YEAR(SALES_DATE)YEAR, MONTH(SALES_DATE)MONTH, GENDER,COUNT(distinct i.USER_ID)USERS
FROM USER_INFO as i,ONLINE_SALE as o
WHERE i.USER_ID = o.USER_ID
AND GENDER is not null
GROUP BY 1,2,3
ORDER BY 1,2,3

문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문 작성. 결과는 년, 월, 성별을 기준으로 오름차순 정렬. 이때, 성별 정보가 없는 경우 결과에서 제외.

 

 뭔가 약간 애매한 문제 였다. 조건 자체는 쉬운데 뭘해야할지 애매한...

 

 먼저 두개의 테이블을 유니크한 값인 USER ID를 사용하여 JOIN 해 주었다.

 

 이후 년,월, 성별별로 데이터를 조회 해야하기에 SELECT 문에서 각각의 데이터가 나오게 배열해 주고 날짜데이터의 경우 년도, 월의 포맷이 같아야 해서 YEAR과 MONTH의 함수를 사용하여 맞추어주었다.

 

 이제 회원수를 집계하는 SQL문을 작성 하여야 하는데 " 동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다." 라는 문구때문에 오히려 헷갈리게 만들었다.. 하나의 판매데이터만 존재하면 중복 제거를 안해도 되나..? 인데 우리가 구하는 기준은 월별이기 때문에 중복된 회원은 1개의 값으로 처리하여 구해야한다. 따라서 distinct 함수를 사용해 유니크한 값인 회원 ID 를 필터링 해준 후 COUNT 처리 해 준다.

 

그리고 성별 정보가 없는 결과를 제외 하는데 이는 GENDER 컬럼에서 값자체가 없는 NULL을 제외 하라는 의미로 IS NOT NULL을 WHERE 절에 필터로 사용하여 제거해 주면된다.

 

그 후 년, 월, 성별 별로 데이터를 집계 하여 추출 해야하므로 GROUP을 년,월,성별 모두 처리해준다. 

 

마무리로 정렬해주면 끝이다.

반응형