프로그래머스 Lv4. 년, 월, 성별 별 상품 구매 회원 수 구하기

2023. 8. 16. 12:30SQL/SQL 테스트 연습

 

문제 설명

 

다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.

 

Column name Type Nullable
USER_ID INTEGER FALSE
GENDER TINYINT(1) TRUE
AGE INTEGER TRUE
JOINED DATE FALSE

 

GENDER 컬럼은 비어있거나 0 또는 1의 값을 가지며 0인 경우 남자를, 1인 경우는 여자를 나타냅니다.

ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며, ONLINE_SALE_ID,  USER_ID, PRODUCT_ID,  SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

 

Column name Type Nullable
ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

 

동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.

 

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

 

문제 풀이

 

SELECT 
    YEAR(OS.SALES_DATE) AS YEAR,
    MONTH(OS.SALES_DATE) AS MONTH,
    UI.GENDER,
    COUNT(DISTINCT OS.USER_ID) AS USERS
FROM 
    ONLINE_SALE OS
JOIN 
    USER_INFO UI ON OS.USER_ID = UI.USER_ID
WHERE 
    UI.GENDER IS NOT NULL
GROUP BY 
    YEAR(OS.SALES_DATE), MONTH(OS.SALES_DATE), UI.GENDER
ORDER BY 
    YEAR, MONTH, GENDER;
  • 선택한 열 (SELECT 문):
    • YEAR(OS.SALES_DATE) AS YEAR: 판매 날짜에서 연도를 추출하여 YEAR라는 별칭으로 표시합니다.
    • MONTH(OS.SALES_DATE) AS MONTH: 판매 날짜에서 월을 추출하여 MONTH라는 별칭으로 표시합니다.
    • UI.GENDER: 사용자의 성별을 표시합니다.
    • COUNT(DISTINCT OS.USER_ID) AS USERS: 각 월별, 성별로 구별되는 고유한 사용자 수를 USERS라는 별칭으로 표시합니다.
  • FROM 절:
    • ONLINE_SALE OS: ONLINE_SALE 테이블을 OS라는 별칭으로 참조합니다.
  • JOIN 절:
    • JOIN USER_INFO UI ON OS.USER_ID = UI.USER_ID: ONLINE_SALE 테이블과 USER_INFO 테이블을 USER_ID를 기준으로 조인합니다.
  • WHERE 절:
    • UI.GENDER IS NOT NULL: 성별 정보가 NULL이 아닌 사용자만을 대상으로 합니다. (즉, 성별 정보가 있는 사용자만을 조회합니다.)
  • GROUP BY 절:
    • GROUP BY YEAR(OS.SALES_DATE), MONTH(OS.SALES_DATE), UI.GENDER: 결과를 판매 날짜의 연도와 월, 그리고 사용자의 성별별로 그룹화합니다.
  • ORDER BY 절:
    • ORDER BY YEAR, MONTH, GENDER: 결과를 연도, 월, 성별 순으로 정렬합니다.