코딩테스트

프로그래머스 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

코드 죄수 2023. 9. 8. 11:44

문제가 원하는 것을 정리하면

 

1. 대여일을 기준으로 2022-8월 ~10까지 대여 횟수가 5이상인 자동차

2. 월별 자동차 ID별 리스트 출력

3. 월이 같다면 자동차 ID기준

 

테이블을 보고 하나씩 sql문을 작성해 나아가도록 하겠다.

 

먼저 1. 대여일을 기준으로 2022-8월 ~10까지 대여 횟수가 5이상인 자동차를 알기 위해 GROUP BY절을 이용하여 알아낸다.

SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID HAVING COUNT(*) >= 5
ORDER BY CAR_ID DESC

 

이제 대여 횟수가 5이상인 CAR_ID는 알아 냈으니 WHERE 절을 이용하여 해당 자동차들의 8월~10월 사이의 데이터만 조회한다.

WHERE CAR_ID IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY CAR_ID HAVING COUNT(*) >= 5
    ORDER BY CAR_ID DESC
    ) 
    AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'

 

그다음 2. 월별 자동차 ID별 리스트 출력 하기 위해 GROUP BY절을 이용한다.

GROUP BY MONTH(START_DATE), CAR_ID

 

마지막으로 3. 월이 같다면 자동차 ID기준은 ORDER BY를 사용한다.

ORDER BY MONTH(START_DATE) ASC, CAR_ID DESC;

 

이제 위 내용을 다 합치면 아래 sql이 만들어 진다.

SELECT MONTH(START_DATE) MONTH, CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE CAR_ID IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY CAR_ID HAVING COUNT(*) >= 5
    ORDER BY CAR_ID DESC
    ) 
    AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY MONTH(START_DATE) ASC, CAR_ID DESC;