[프로그래머스 / SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
(MySQL, GROUP BY, MONTH, DATE_FORMAT, BETWEEN, WHERE 서브쿼리)
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/151139
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
2. 문제 해결 아이디어 (풀이)
1. WHERE 서브쿼리를 이용하여 2022-8 월부터 10월까지 자동차별로 5개가 넘는 경우의 CAR_ID를 가져온다.
* DATE_FORMAT을 이용하여 년, 월 형식을 가져온다.
* BETWEEN A AND B를 함께 사용해도 된다.
2. 다시 본 쿼리에서 2022-8월부터 10월까지 걸러준다.
* 서브쿼리에서 CAR_ID로 가져왔기 때문에, 데이터에 7월이 있다면 그것도 집계되어 버릴 수 있음
3. GROUP BY로 월, 자동차별로 묶어서 개수를 세어준다.
* GROUP BY 열1, 열 2... 이런 식으로 여러 개를 그루핑 할 수 있다.
* HAVGING을 이용하여 그루핑 결과에서 조건을 줄 수 있다.
3.1. 이때, SELECT 절에 월의 숫자만 나타내도록 'MONTH' 함수를 이용해 준다.
* DATE_FORMAT("%m") 은 한자리 숫자 앞에 0이 붙기 때문에 사용하지 않는다.
3. 코드
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECOREDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN ( # 2022-08 ~ 2022-10 중에 5개 넘는 친구들만
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE
DATE_FORMAT(START_DATE, "%Y-%m") = '2022-08' OR
DATE_FORMAT(START_DATE, "%Y-%m") = '2022-09' OR
DATE_FORMAT(START_DATE, "%Y-%m") = '2022-10'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5 ) # 5 이상인 경우
AND (DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10') # 꺼낸 CAR_ID중 7월이 있을수도 있음 그래서 한번 더 걸러주기
GROUP BY MONTH, CAR_ID # 월별로 묶어야 ㅎㄴ다.
HAVING COUNT(*) > 0 # 0보다 커야한다.
ORDER BY MONTH ASC, CAR_ID DESC
4. 마무리
AND (DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10') # 이
- 위 코드와 같이, 한번 더 본 쿼리 WHERE로 데이터를 나눠주는 게 요점이었다.
- 이런 점들도 고려해야 하는 것을 알게 되었다.
- 참고자료
[Programmers] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼
velog.io
'코딩테스트 > SQL' 카테고리의 다른 글
[프로그래머스/SQL] 연도 별 미세먼지 농도 조회하기 풀이 (ROUND, DATE_FORMAT, YEAR) (0) | 2025.03.12 |
---|---|
[프로그래머스/MySQL] 물고기 종류 별 잡은 수 구하기 풀이 (GROUP BY, 서브쿼리, SQL 고득점 kit) (0) | 2025.02.20 |
댓글