[SQL] Programmers - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 <CASE, GROUP BY, SUBQUERY>

2023. 4. 10. 16:10공부/SQL

Problem

Solution

CASE문을 사용하면 쉽게 해결이 가능 할 줄 알았다.

SELECT 
    CAR_ID,
    # DATE_FORMAT(END_DATE, '%Y-%m-%d'),
    CASE
        WHEN DATE_FORMAT(END_DATE, '%Y-%m-%d') < '2022-10-16' 
        THEN '대여 가능'
        ELSE '대여중'
    END AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

하지만 이 쿼리문에서 문제는 CASE 문의 조건에 있는데, 같은 CAR_ID라도, 여러번 대여가 가능한데 AVAILABLILITY는 그걸 반영하지 못함.

 

예시를 들자면,  2022-09-30 에 김옥냥이라는 친구가 CAR_ID = 3 인 자동차를 대여해서 2022-10-05일에 반납을 완료했지만, 김뚱땅이라는 친구가 같은 차량을 2022-10-08일날 다시 대여를해서 2022-10-30일에 반납 하려고한다면, 이 쿼리문은 END_DATE<2022-10-16 이 유효하므로 대여 가능이라는 문자열을 반환할 것이다.

 

그러면 CASE문의 조건을 바꿔야 할 것이다

 

CASE 문의 조건이 START_DATE < 2022-10-16 < END_DATE 일 경우에는 김옥냥이 2022-10-05에 반납을 하였어도, 김뚱땅이라는 친구의 START_DATE가 2022-10-08이고 END_DATE가 2022-10-30이므로 새로운 CASE문의 조건에 포함되기 때문에 대여중이라는 결과를 반환할 것이다.

 

이 CASE문의 조건을 반영한 쿼리문을 다시 작성해보자

 

 

SELECT 
    CAR_ID,
    CASE
        WHEN CAR_ID 
        IN (
            SELECT CAR_ID 
            FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
            WHERE DATE('2022-10-16') BETWEEN START_DATE AND END_DATE
        )
        THEN '대여중'
        ELSE '대여 가능'
    END AVAILABILITY

FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;