✅문제
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별로 쪼개서 그룹화하는 것임
'DB > SQL' 카테고리의 다른 글
[SQL]프로그래머스 - 우유와 요거트가 담긴 장바구니 (0) | 2023.06.08 |
---|---|
[SQL]변수 (0) | 2023.05.31 |
[SQL] 데이터 형식, 형변환 (mysql) (0) | 2023.05.31 |
[SQL]프로그래머스 - 자동차 평균 대여 기간 구하기 (0) | 2023.05.31 |
[SQL] 행 입력, 수정, 삭제 CRUD (0) | 2023.05.30 |