처음에는 반납일이 2022-10-16 이후면 그 날 대여가 가능하다고 생각했다.
SELECT CAR_ID, CASE
WHEN MAX(END_DATE)>'2022-10-16'
THEN '대여 가능'
ELSE '대여중' END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID;
이렇게 했었나??
암튼 근데 당근 틀렸다!
왜냐면 이런 데이터가 있었기 때문에
CAR_ID | START_DATE | END_DATE |
---|---|---|
1 | 2022-10-03 | 2022-10-09 |
1 | 2022-10-17 | 2022-11-11 |
뭐 이런 거 ..!
그러면 반납하고 다시 빌리는 저 사이 기간에 ‘2022-10-16’이 포함되기 때문에 1번 자동차는 ‘대여 가능’
이 되어야 하는데 내가 쓴 코드로 하면 ‘대여중’
으로 뜨게 된다.
그래서 우선 ‘2022-10-16’에 대여 중인 자동차 목록을 먼저 만들었다.
START_DATE와 END_DATE 기간 사이에 ‘2022-10-16’이 끼어있는 자동차를 찾으면 된다.
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16'
이렇게 하면 대여 중인 자동차의 CAR_ID만 뜨게 된다.
그 다음, 저 테이블과 원래 테이블을 LEFT JOIN하면 대여 가능한 자동차의 CAR_ID 는 NULL값이 된다. ( 대여 중인 자동차의 CAR_ID만 있기 때문에)
코드를 보면 더 쉬울 듯
# 대여중인 자동차 목록
WITH O AS (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16')
SELECT C.CAR_ID,
CASE WHEN O.CAR_ID IS NULL
THEN '대여 가능'
ELSE '대여중'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY C
LEFT JOIN O ON O.CAR_ID = C.CAR_ID # 대여중인 자동차 번호만 JOIN 됨
GROUP BY C.CAR_ID
ORDER BY C.CAR_ID DESC;
이렇게 위 코드처럼 실행하면 C.CAR_ID는 다 뜨지만 O.CAR_ID는 ‘대여 가능’인 CAR_ID가 NULL이다!
그래서 그 둘을 조인 한 다음에 CASE WHEN 구문을 써서 NULL인 값은 ‘대여 가능’, 그 외에는 ‘대여중’으로 표기하면 정답이 뜬다~~