본문 바로가기

SQL

[SQL 문제풀이] 년, 월, 성별 별 상품 구매 회원 수 구하기-프로그래머스

문제링크

 

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