꾸물꾸물 졔의 개발공부

[MySQL] 프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (GROUP BY, DATE_FORMAT, DISTINCT) 본문

알고리즘/SQL

[MySQL] 프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (GROUP BY, DATE_FORMAT, DISTINCT)

체제 2023. 5. 16. 20:56

https://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 값이므로 명시하지 않아도 됨!