꾸물꾸물 졔의 개발공부
[MySQL] 프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (GROUP BY, DATE_FORMAT, DISTINCT) 본문
[MySQL] 프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (GROUP BY, DATE_FORMAT, DISTINCT)
체제 2023. 5. 16. 20:56https://school.programmers.co.kr/learn/courses/30/lessons/131532
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.
구현 과정
- 두 테이블 JOIN 하여 합치고, 성별 정보가 없는 경우는 제외
- 년, 월, 성별 별로 상품 구매한 회원 수 집계
1️⃣ 두 테이블 JOIN 하여 합치고, 성별 정보가 없는 경우는 제외
조회하기 위해 필요한 컬럼이 USER_INFO, ONLINE_SALE 두 테이블에 나뉘어 저장되어 있기 때문에, 두 테이블을 JOIN 한다. 두 테이블에 모두 있는 USER_ID 컬럼을 기준으로 JOIN 하고 , 성별 정보가 없는 경우 즉, GENDER 값이 NULL인 경우는 제외한다. WHERE 절로 NULL 값 제외 조건 추가.
SELECT *
FROM USER_INFO U JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
2️⃣ 년, 월, 성별 별로 상품 구매한 회원 수 집계
년, 월, 성별별로 그룹화 하기 위해서, 우선 ONLINE_SALE 테이블의 SALES_DATE 에서 년, 월 정보를 추출한다.
- 년 : DATE_FORMAT(SALES_DATE, "%Y") 로 날짜의 년도만 조회 (YEAR() 도 가능)
- 월 : MONTH(SALES_DATE)로 날짜의 월만 조회
👆위 함수를 사용하여 년,월 정보만 추출하였고 AS 연산자를 사용하여 각각 YEAR, MONTH 로 별칭 지정.
년, 월, 성별 3개의 컬럼값의 조합을 기준으로 그룹화 하기 위해서 GROUP BY 절에 속성을 콤마(,) 기준으로 나열한다.
- GROUP BY 속성1,속성2,.,속성n : 그룹화 하는 기준이 속성1..속성n 임을 의미
그룹화 후, COUNT() 집계함수를 사용하여 각 그룹별 회원수를 카운트하는데, 특정 회원이 같은 년도, 같은 월에 다른 상품(PRODUCT_ID)을 구매한 경우도 있을 수 있으니 중복을 제외하여 카운트해야한다. DISTINCT 함수를 사용하여 USER_ID 의 중복을 제외하여 COUNT
SELECT DATE_FORMAT(O.SALES_DATE, "%Y") AS YEAR, MONTH(O.SALES_DATE) AS MONTH, U.GENDER AS GENDER
,COUNT(DISTINCT(O.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
✔️코드
SELECT DATE_FORMAT(O.SALES_DATE, "%Y") AS YEAR, MONTH(O.SALES_DATE) AS MONTH, U.GENDER AS GENDER
,COUNT(DISTINCT(O.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;
👉정렬도 년,월,성별을 기준으로 오름차순 정렬이기 때문에 GROUP BY 처럼 콤마 기준으로 줄줄줄 나열. 오름차순 ASC 는 DEFAULT 값이므로 명시하지 않아도 됨!
'알고리즘 > SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 - 취소되지 않은 진료 예약 조회하기 (JOIN, String) (0) | 2023.05.17 |
---|---|
[MySQL] 프로그래머스 - 우유와 요거트가 담긴 장바구니 (GROUP_CONCAT, LIKE, SubQuery) (0) | 2023.05.17 |
[MySQL] 프로그래머스 - 서울에 위치한 식당 목록 출력하기 (JOIN, GROUP BY, LIKE, ROUND 반올림) (0) | 2023.05.15 |
[MySQL] 프로그래머스 - 식품분류별 가장 비싼 식품의 정보 조회하기 (WHERE-IN, SubQuery) (0) | 2023.05.12 |
[MySQL] 프로그래머스 - 5월 식품들의 총매출 조회하기 (JOIN, DATE, GROUP BY, SUM) (0) | 2023.05.11 |