본문 바로가기
MYSQL/프로그래머스 LV03

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

by 수스리 2025. 3. 6.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

WITH over5 AS (
    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
)

SELECT
    MONTH(H.start_date) AS MONTH, 
    H.CAR_ID, 
    COUNT(*) AS RECORDS
FROM
    CAR_RENTAL_COMPANY_RENTAL_HISTORY H
JOIN
         over5 O ON H.car_id = O.car_id
WHERE start_date BETWEEN "2022-08-01" AND "2022-10-31"
GROUP BY
    MONTH(H.start_date), H.car_id
ORDER BY 
    MONTH(H.start_date) ASC, H.car_id DESC;

위가 정답 코드다. 그러나 초반에 이 문제를 틀렸다. 우선 WITH으로 가상 테이블을 만든다는 생각을 못했다. 어찌어찌 가상 테이블을 만들고 또 문제가 생겼다. 아래는 내가 틀린 코드다. 

WITH over5 AS (
    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
)

SELECT
    MONTH(H.start_date) AS MONTH, 
    H.CAR_ID, 
    COUNT(*) AS RECORDS
FROM
    CAR_RENTAL_COMPANY_RENTAL_HISTORY H
JOIN
         over5 O ON H.car_id = O.car_id
GROUP BY
    MONTH(H.start_date), H.car_id
ORDER BY 
    MONTH(H.start_date) ASC, H.car_id DESC;

 꼼꼼한 독자라면 알겠지만 WHERE 절이 없다. WHERE 절이 없으면 이 코드는 8월부터 10월까지의 대여 기록이 아닌 전체 기간의 대여기록을 찾아서 데이터를 추출한다.