<문제>
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

<포인트>
- 가장 최근의 대여 마지막 날짜를 기준으로 계산하면 10월 16일에 대여중인지 아닌지 정확한 판단이 어려움
-SELECT 절에서 TRUE / FALSE 로 원하는 기준을 필터링 할 수 있음
-MAX 를 사용해 TRUE 를 필터링 할 수 있음
'SQL' 카테고리의 다른 글
프로그래머스 SQL 오답노트 Level 3 업그레이드 할 수 없는 아이템 구하기 (0) | 2025.10.16 |
---|---|
프로그래머스 SQL 오답노트 Level 4 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2025.10.15 |
프로그래머스 SQL 오답노트 Level 3 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (0) | 2025.10.14 |
프로그래머스 SQL 오답노트 Level 3 오랜 기간 보호한 동물 (2) (0) | 2025.10.14 |
프로그래머스 SQL 오답노트 251010 (0) | 2025.10.10 |