DB/SQL

[SQL]프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수

journey-dev 2023. 6. 9. 10:42

 ✅문제

https://school.programmers.co.kr/learn/courses/30/lessons/131532

 

✅풀이

[나의 풀이]

1. 두 테이블을 USER_ID 기준으로 조인한 후, 성별이 null이 아닌 것만 조회
2. 이후 SALES_DATE를 년 기준으로, 같다면 월기준으로, 같다면 성별 기준으로 그룹화하여 중복 삭제하면서
3. USER_ID를 카운트 한다. 이때 같은 년,월에 중복되는 USER_ID가 있다면 카운트 제외
4. 이후 년,원,성별 순으로 카운트

SELECT  YEAR(O.SALES_DATE) as YEAR, MONTH(O.SALES_DATE) as MONTH , U.GENDER, count(distinct U.USER_ID ) as USERS
from USER_INFO U join ONLINE_SALE O 
on U.USER_ID = O.USER_ID 
where  U.GENDER IS NOT NULL
group by YEAR(O.SALES_DATE) , MONTH(O.SALES_DATE), U.GENDER
order by YEAR(O.SALES_DATE) , MONTH(O.SALES_DATE), U.GENDER

 

 

✅피드백

1. IS NULL, IS NOT NULL 

수정 전)

GENDER 값이 0,1,null 중에 null이 아닌 것만 조회해야 하는데, 처음에 IN연산자를 활용했다.

가독성도 안좋고 값을 일일히 다 따져야 하는 번거로운이 있다.

where U.GENDER IN (0,1) -- gender가 null인지를 파악하기 위해 0,1,null 모든 값을 다 따져야 함

수정 후)

null인지 여부만 파악하면 되도록 수정, 더 가독성도 좋아졌다.

where  U.GENDER IS NOT NULL -- 더 명확한 코드, null인지 아닌지만 판단하면 된다.

 

2. 다중 group by 로직

year가 같다면 그 중 month별로 쪼개고, 또 month가 같다면 gender별로 쪼개서 그룹화하는 것임