반응형
문제
다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 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문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.
개념 공부하기
GROUP BY, COUNT | GROUP 그룹화 후 COUNT 세기 |
JOIN, INNER JOIN | JOIN : 두 테이블 합치기 |
풀이
문제를 읽으면서 조건들을 분리하며 이해해 본다.
(년, 월, 성별) 별로 출력을 해야 하니 그룹을 묶어줘야겠다.
- 우선 user table과 online table을 user_id로 join을 시킨다.
- 판매 년도와 월은 DATE_FORMAT()을 이용하여 추출한 뒤 column명을 year, month로 지정하여 나중에 group by (column명)을 깔끔하게 해 준다.
- 년, 월, 성별로 그룹을 묶어준 뒤 집계함수 count로 집계해준다.
- (주의) join 된 테이블 결과는 한 회원이 여러 번 구매 이력이 있을 수 있기 때문에 distinct를 이용하여 중복 회원 id를 제거해 준 뒤 count를 세줘야 한다.
- 성별이 null 인 경우는 where 조건을 통해 제거해준다.
- 문제에서 원하는 대로 order by
SELECT DATE_FORMAT(O.SALES_DATE, '%Y') AS YEAR,
DATE_FORMAT(O.SALES_DATE, '%m') AS MONTH,
GENDER,
COUNT(DISTINCT U.USER_ID) AS USERS
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER
;
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131532
반응형
'PS > SQL' 카테고리의 다른 글
프로그래머스 즐겨찾기가 가장 많은 식당 정보 출력하기 SQL(MySQL) (1) | 2023.05.09 |
---|---|
프로그래머스 그룹별 조건에 맞는 식당 목록 출력하기 SQL(MySQL) (2) | 2023.05.08 |
프로그래머스 상품 별 오프라인 매출 구하기 SQL(MySQL) (0) | 2023.05.06 |
프로그래머스 조건에 맞는 사용자와 총 거래 금액 조회하기 SQL(MySQL) (1) | 2023.05.06 |
프로그래머스 조건에 부합하는 중고거래 상태 조회하기 SQL(MySQL) (0) | 2023.05.06 |