문제링크
USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/131532#qna
풀이
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
'SQL' 카테고리의 다른 글
[SQL 문제풀이] 상품을 구매한 회원 비율 구하기-프로그래머스 (0) | 2023.04.19 |
---|---|
[SQL 문제풀이] 식품분류별 가장 비싼 식품의 정보 조회하기-프로그래머스 (0) | 2023.04.13 |
[SQL 문제풀이] 식품분류별 가장 비싼 식품의 정보 조회하기-프로그래머스 (0) | 2023.04.13 |
[SQL 문제풀이] 입양 시각 구하기(2)-프로그래머스 (0) | 2023.04.12 |
[SQL 문제풀이] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기-프로그래머스 (0) | 2023.04.12 |