본문 바로가기
SQL/SQL 테스트 연습

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

by 아이언곰 2023. 8. 16.

 

문제 설명

 

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다.  CAR_ RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END _DATE는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

 

Column name Type Nullable
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

 

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(칼럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해 주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해 주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해 주세요.

 

문제 풀이
WITH MonthlyRentals AS (
    SELECT 
        EXTRACT(MONTH FROM START_DATE) AS MONTH,
        CAR_ID,
        COUNT(*) AS RECORDS
    FROM 
        CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE 
        START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY 
        EXTRACT(MONTH FROM START_DATE),
        CAR_ID
),
HeavyRenters AS (
    SELECT 
        CAR_ID
    FROM 
        MonthlyRentals
    GROUP BY 
        CAR_ID
    HAVING 
        SUM(RECORDS) >= 5
)
SELECT 
    MR.MONTH,
    MR.CAR_ID,
    MR.RECORDS
FROM 
    MonthlyRentals MR
JOIN 
    HeavyRenters HR ON MR.CAR_ID = HR.CAR_ID
WHERE 
    MR.RECORDS > 0
ORDER BY 
    MR.MONTH ASC,
    MR.CAR_ID DESC;

WITH AS절로 식을 간단하게 정리했으며, 쿼리 과정에서 만들어진 MonthlyRentals과 HeavyRenters를 조인시키고, 정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외하는 쿼리문을 작성했다.