SQL

프로그래머스 SQL 오답노트 Level 3 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

datahaseo 2025. 10. 14. 18:21
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
 

<문제>

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

 

 

<틀렸던 이유>

1. 문제 해석의 오류

WITH A AS (
SELECT * ,MAX(end_date) OVER (PARTITION BY CAR_ID ORDER BY end_date DESC) LATEST
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
ORDER BY CAR_ID
)

SELECT CAR_ID,   
       CASE WHEN '2022-10-16' BETWEEN start_date AND END_DATE THEN '대여중'
       ELSE '대여 가능' END AVAILABILITY

FROM A
WHERE END_DATE = LATEST
ORDER BY CAR_ID DESC

 

 

예시를 보면 대여가 여러번 된 차량에 대해서 2022.10.16 당일을 기준으로 대여가 가능한지 불가능 한지를 체크하는 것이 목적임.

 

그런데 나는 차량이 여러개 있으니 가장 최근 END DATE 를 기준으로 대여가 가능한지 불가능 한지를 보려고 했음

이떄문에 END DATE 에 MAX 를 붙인 후 그 값을 기준으로 대여 가능 여부를 확인함

 

 

 

 

그런데 이럴 경우,  아래 처럼 조회했을 떄 

SELECT * ,MAX(end_date) OVER (PARTITION BY CAR_ID ORDER BY end_date DESC) LATEST,
       '2022-10-16' BETWEEN START_dATE AND END_DATE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
ORDER BY CAR_ID

 

 

실제로 내가 필요한 것은 노란색 박스, 즉 '2022-10-16' BETWEEN START_dATE AND END_DATE 가 TRUE 인 항목인데

내가 MAX 처리한 가장 최근의 END DATE 항목을 사용하게 되면서 의도와 달라지게 되었음.

 

따라서 잘못된 문제 해석에 대한 정정이 필요했

 

 

2. TRUE / FALSE 를 이용한 대여 가능 여부 체크

SELECT 절에서  '2022-10-16' BETWEEN START_dATE AND END_DATE 가 TRUE 인지 FALSE 인지 0과 1로 구분이 가능함

 

위의 0과 1 값을 응용하면, CAR_ID 별로 0,1 을 봤을 때, 1인 항목들을 대여중이라고 CASE WHEN 구문으로 표현할 수 있었음

 

 

 

 

<정답 쿼리>

SELECT CAR_ID,
       CASE WHEN MAX('2022-10-16' BETWEEN START_dATE AND END_DATE)=1 THEN '대여중'
       ELSE '대여 가능' END AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
<WJD
 

 

 

<포인트>

- 가장 최근의 대여 마지막 날짜를 기준으로 계산하면 10월 16일에 대여중인지 아닌지 정확한 판단이 어려움

-SELECT 절에서 TRUE / FALSE 로 원하는 기준을 필터링 할 수 있음

-MAX 를 사용해 TRUE 를 필터링 할 수 있음

 

 

 

 

 

자동차 대여 기록에서 대여중 /<해겨 대여 가능 여부 구분하기