SQL
[SQL 문제풀이] 년, 월, 성별 별 상품 구매 회원 수 구하기-프로그래머스
illho
2023. 4. 13. 12:55
문제링크
USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/131532#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
1. 회원 수를 집계 해야 하기 때문에 해당 년도 월에 한 USER가 여러개를 구매한 중복을 제거 하기 위해 년, 월, 사용자 아이디를 GROUP BY 기준으로 추출하는 쿼리를 만들었다.
2. USER_INFO 테이블과 USER_ID기준으로 INNER JOIN 하고 년도, 월 , 성별로 GROUP BY 를 하고 USER_ID를 COUNT 하였다.
쿼리
SELECT
B.YEAR , TO_NUMBER(B.MONTH) AS MONTH , GENDER , COUNT(B.USER_ID) AS USERS
FROM
USER_INFO A,
(
SELECT
USER_ID,
TO_CHAR(SALES_DATE,'YYYY') AS YEAR,
TO_CHAR(SALES_DATE,'MM') AS MONTH
FROM
ONLINE_SALE
GROUP BY
TO_CHAR(SALES_DATE,'YYYY') , TO_CHAR(SALES_DATE,'MM') , USER_ID
) B
WHERE
A.USER_ID = B.USER_ID
AND A.GENDER IS NOT NULL
GROUP BY YEAR , MONTH , GENDER
ORDER BY YEAR , MONTH , GENDER ASC ;
다른 방법 풀이
오라클의 DISTINCT 중복제거 함수를 사용하면 더 간단하게 쿼리를 짤 수 있다는 것을 알게 됐다.
년, 월, 성별, 사용자 아이디를 컬럼으로 사용하고 DISTINCT 를 사용하여 해당 년도,월에 중복된 구매 횟수를 제거 하였다.
SELECT
YEAR,
MONTH,
GENDER,
COUNT(USER_ID)
FROM
(
SELECT
DISTINCT
TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH,
GENDER,
OS.USER_ID
FROM ONLINE_SALE OS
INNER JOIN USER_INFO UI
ON OS.USER_ID = UI.USER_ID
WHERE 1=1
AND GENDER IS NOT NULL
)
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER