해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 JOIN, DATE관련 함수, GROUP BY를 이용하여 푸는 문제로 초보자가 하기에는 쉬움 정도의 난이도를 가지고 있는 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.
이 문제는 간단하게 년, 월, 성별 별로 구매한 회원 수를 구하면 되는 매우 간단한 문제입니다.
그래도 해당 문제에서 생각해야 될 것이 있습니다. 한 유저의 기록이 여러개 있을 수도 있다는 것입니다.
예를 들어 1이라는 USER_ID를 가지고 있는 2022년 6월에 상품을 구매한 남성이 6월에 2번 이상 구매했을 경우도 생각해야 되는 것이지요.
그래서 해결 방법으로 USER_ID를 중복을 제거해주는 방법을 사용해주면 쉽게 풀릴 것 같습니다.
1. 테이블끼리 JOIN을 통해 합쳐주고 년 월 성별 가져오기
SELECT YEAR(s.sales_date) AS YEAR
, MONTH(s.sales_date) AS MONTH
, i.GENDER
FROM USER_INFO i
JOIN
ONLINE_SALE s ON i.USER_ID = s.USER_ID
이와 같이 YEAR() 함수와 MONTH() 함수를 통해 각 날짜 데이터의 연도와 월을 가져올 수 있었습니다.
2. 조건에 맞게 성별이 없는 것은 제거 후 연도, 월, 성별별로 GROUP BY 하기
SELECT YEAR(s.sales_date) AS YEAR
, MONTH(s.sales_date) AS MONTH
, i.GENDER
FROM USER_INFO i
JOIN
ONLINE_SALE s ON i.USER_ID = s.USER_ID
WHERE i.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
이렇게 WHERE 절을 사용하여 성별 컬럼에 NULL값이 없는 값들만 보도록 만들어 준 뒤
연도 월 성별을 모두 GROUP BY를 사용하여 묶어주었습니다.
그럼 위의 이미지와 같이 따로 따로 구분 된 것을 확인 할 수 있습니다.
3. 위의 조건과 같게 중복되지 않도록 구매한 회원 수 COUNT하기
SELECT YEAR(s.sales_date) AS YEAR
, MONTH(s.sales_date) AS MONTH
, i.GENDER
, COUNT(DISTINCT s.USER_ID) AS USERS
FROM USER_INFO i
JOIN
ONLINE_SALE s ON i.USER_ID = s.USER_ID
WHERE i.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER
이렇게 중복이 되지 않도록 USER_ID 앞에 DISTINCT를 사용해주고 COUNT를 해주면 중복이 있는 회원이더라도 회원이 하나만 세어지게 됩니다.
마지막으로 조건에 맞게 정렬을 해주면 해당 코드는 정답이 됩니다.
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기(특정 기간동안 대여 가능한 자동차들의 대여비용 구하기) (0) | 2024.11.07 |
---|---|
[SQL] Programmers 문제 풀기(주문량이 많은 아이스크림들 조회하기) (0) | 2024.11.06 |
[SQL] Programmers 문제 풀기(업그레이드 할 수 없는 아이템 구하기) (0) | 2024.11.04 |
[SQL] Programmers 문제 풀기(연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기) (0) | 2024.11.01 |
[SQL] Programmers 문제 풀기(저자 별 카테고리 별 매출액 집계하기) (0) | 2024.10.31 |