https://school.programmers.co.kr/learn/courses/30/lessons/131532
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.
예시
예를 들어 USER_INFO 테이블이 다음과 같고
USER_ID | GENDER | AGE | JOINED |
1 | 1 | 26 | 2021-06-01 |
2 | NULL | NULL | 2021-06-25 |
3 | 0 | NULL | 2021-06-30 |
4 | 0 | 31 | 2021-07-03 |
5 | 1 | 25 | 2021-07-09 |
6 | 1 | 33 | 2021-07-14 |
ONLINE_SALE 테이블이 다음과 같다면
ONLINE_SALE_ID | USER_ID | PRODUCT_ID | SALES_AMOUNT | SALES_DATE |
1 | 1 | 54 | 1 | 2022-01-01 |
2 | 1 | 3 | 2 | 2022-01-25 |
3 | 4 | 34 | 1 | 2022-01-30 |
4 | 6 | 253 | 3 | 2022-02-03 |
5 | 2 | 31 | 2 | 2022-02-09 |
6 | 5 | 35 | 1 | 2022-02-14 |
7 | 5 | 57 | 1 | 2022-02-18 |
2022년 1월에 상품을 구매한 회원은 USER_ID 가 1(GENDER=1), 4(GENDER=0)인 회원들이고,
2022년 2월에 상품을 구매한 회원은 USER_ID 가 2(GENDER=NULL), 5(GENDER=1), 6(GENDER=1)인 회원들 이므로,
년, 월, 성별 별로 상품을 구매한 회원수를 집계하고, 년, 월, 성별을 기준으로 오름차순 정렬하면 다음과 같은 결과가 나와야 합니다.
YEAR | MONTH | GENDER | USERS |
2022 | 1 | 0 | 1 |
2022 | 1 | 1 | 1 |
2022 | 2 | 1 | 2 |
정답
SELECT YEAR(A.SALES_DATE) AS YEAR ,MONTH(A.SALES_DATE) AS MONTH,B.GENDER,COUNT(DISTINCT A.USER_ID) AS USERS
FROM ONLINE_SALE AS A
INNER JOIN USER_INFO AS B
ON A.USER_ID=B.USER_ID
WHERE B.GENDER IS NOT NULL
GROUP BY YEAR,MONTH, GENDER
ORDER BY YEAR,MONTH,GENDER
정답 테이블에 년도와 월만이 표시되어 있기 때문에 YEAR(A.SALES_DATE), MONTH(A.SALES_DATE)를 이용해 표시형식을 바꾸어 주었고, 상품을 구매한 회원수를 집계하기 위해 COUNT(DISTINCT A.USER_ID)를 이용하였다.
그리고 주어진 두 테이블의 공통열은 USER_ID이기 때문에 이 열을 기준으로 JOIN하였고, USER_INFO테이블의 GENDER열이 NULL인 경우는 집계에서 제외이기 때문에 WHERE절을 이용하였다. 여기서 GROUP BY이전에 사용하기 때문에 WHERE절을 이용하였지만 GROUP BY절 다음 HAVING절을 이용해도 정답이다.
년, 월, 성별 별로 상품을 구매한 회원수를 집계하는것이 때문에 이 순서 그대로 GROUP BY를 이용하였다.
SELECT DATE_FORMAT(A.SALES_DATE,'%Y') AS YEAR ,DATE_FORMAT(A.SALES_DATE,'%c') AS MONTH,B.GENDER,COUNT(DISTINCT A.USER_ID) AS USERS FROM ONLINE_SALE AS A
INNER JOIN USER_INFO AS B
ON A.USER_ID=B.USER_ID
WHERE B.GENDER IS NOT NULL
GROUP BY YEAR,MONTH, GENDER
ORDER BY YEAR,MONTH,GENDER
추가로 위 코드는 DATE_FORMAT을 이용한 코드이지만 정답이 아닌 상황이다. 이 부분에 대해서는 아직 이유를 찾지 못했으므로 찾게되는 바로 추가할 예정이다.
'SQL' 카테고리의 다른 글
서브쿼리 응용(3) (1) | 2023.01.06 |
---|---|
3개 이상의 테이블 JOIN (0) | 2023.01.05 |
WHERE 논리 연산자 응용 (0) | 2023.01.03 |
GROUP_CONCAT 응용 (0) | 2023.01.02 |
서브퀴리 응용(2) (0) | 2023.01.01 |