이 험난한 세상에서어어~

대여 횟수가 많은 자동차들의 월별 본문

카테고리 없음

대여 횟수가 많은 자동차들의 월별

토끼띠NJW 2023. 7. 21. 14:37

문제 설명

2022년 8월부터 2022년 10월까지 대여 횟수가 5회 이상인 자동차 중에서 월별 자동차 ID의 총 대여 횟수를 구하는 문제이다.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이

첫 번째 접근

일단 2022년 8월부터 10월 사이에 대여가 시작된 자동차들 중에서 그 횟수가 5회 이상인 자동차 ID를 뽑기 위해 서브 쿼리를 작성했다.

WHERE CAR_ID IN (
    SELECT CAR_ID	
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE YEAR(START_DATE) = 2022 AND (MONTH(START_DATE) BETWEEN 8 AND 10)
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5
)

그리고 월별 자동차 대여 수라고 했으니 월과 자동차 ID로 묶은 다음에 월을 기준으로 대여 횟수가 0인 자동차가 없기 위해 HAVING을 써서 조건을 줬다.

GROUP BY MONTH(START_DATE), CAR_ID
HAVING COUNT(CAR_ID) > 0

마지막으로 문제에 주어진 대로 정렬을 했다.

ORDER BY MONTH(START_DATE), CAR_ID DESC

문제 상황

문제에서 주어진 대로 잘 한 거 같은데, 자꾸만 틀렸다고 하길래 인터넷을 찾아보니 조건을 두 번 줘야 하는 것을 알 수 있었다. 아래는 정답 코드의 WHERE 문이다.

WHERE CAR_ID IN (
    SELECT CAR_ID	
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE YEAR(START_DATE) = 2022 AND (MONTH(START_DATE) BETWEEN 8 AND 10)
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5
) AND YEAR(START_DATE) = 2022 AND (MONTH(START_DATE) BETWEEN 8 AND 10)

보면 알겠지만, 서브 쿼리를 끝내고 나서도 뒤에 또 2022년 8월부터 10월 사이라는 조건을 준 것을 알 수 있다.

 

이는 왜냐하면 만일 서브 쿼리로 2022년 8월에서 10월까지 대여 시작일인 자동차의 ID를 뽑았다고 하자. 그런데, 만일 같은 ID로 11월부터 대여가 시작된 기록이 있다면 어떻게 될까. 이렇게 되면 전체 쿼리에서는 8월부터 10월뿐만 아니라 11월의 대여 기록까지 갇티 가지고 오게 된다. 그러므로 조건을 두 번 줘서 완전히 8월부터 10월까지의 데이터만 뽑아와야 하는 것이다.

코드

MySQL

-- 코드를 입력하세요
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(CAR_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
-- 8월에서 10월까지 자동차 ID를 뽑아왔다고 해도 같은 ID로 조건과 다른 대여일이 있을 수 있으니 한 번더 조건을 넣어줘야 한다.
WHERE CAR_ID IN (
    SELECT CAR_ID	
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE YEAR(START_DATE) = 2022 AND (MONTH(START_DATE) BETWEEN 8 AND 10)
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5
) AND YEAR(START_DATE) = 2022 AND (MONTH(START_DATE) BETWEEN 8 AND 10)
GROUP BY MONTH(START_DATE), CAR_ID
HAVING COUNT(CAR_ID) > 0
ORDER BY MONTH(START_DATE), CAR_ID DESC