문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
오답 쿼리
SELECT
CAR_ID,
CASE
WHEN "2022-10-16" BETWEEN MAX(START_DATE) AND DATE_ADD(MAX(END_DATE), INTERVAL 1 DAY) THEN "대여중"
ELSE "대여 가능"
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
해당 쿼리는 오답을 반환하는데, 어떤 부분이 틀렸는지 이유를 생각해보고 정리해보았다.
MAX(START_DATE)와 MAX(END_DATE)는 각 CAR_ID별 가장 최근의 대여 기록을 찾는다. 즉, 차량이 여러 번 대여되었더라도 마지막 대여 기록만 확인하게 된다. 그 마지막 대여 기간이 2022-10-16을 포함하는지 확인하여 '대여중' 또는 '대여 가능'을 결정한다.
CAR_ID가 A001인 차량의 대여기록이 있다고 가정해보자.
- 첫 번째 대여 기록 : 2022-10-10 ~ 2022-10-17
- 두 번째 대여 기록 : 2022-10-20 ~ 2022-10-25
오답 쿼리는 차량에 대해 MAX(START_DATE) = 2022년 10월 20일, MAX(END_DATE) = 2022년 10월 25일을 사용한다. 10월 16일에 대여 중임에도, MAX 값의 범위 사이에 없기 때문에 대여 가능으로 판단한다.
수정한 쿼리
SELECT CAR_ID,
CASE
WHEN MAX(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16') THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
수정된 쿼리는 각 대여 기록마다 2022년 10월 16일이 해당 기간에 속하는지 평가한 후, MAX 함수를 사용한다.
첫 번째 기록의 경우 시작일이 10월 10일이고 종료일이 10월 17일이다. 10월 16일은 해당 기간 사이에 있으므로, 조건이 성립한다. 두 번째 기록의 경우 시작일이 10월 20일이고 종료일이 10월 25일이다. 10월 16일은 10월 20일보다 이전이므로, 조건은 거짓이다.
SQL에서 MAX 함수를 사용하면 각 기록의 조건 결과 중 최대값을 구한다. Boolean 값에서 TRUE는 1, FALSE는 0으로 간주되므로 MAX(TRUE, FALSE)는 TRUE가 된다. 따라서 하나라도 조건이 참인 기록이 존재하기 때문에 최종 결과는 대여중으로 반환된다.
'코딩 테스트 > SQL' 카테고리의 다른 글
| [MYSQL] 입양 시각 구하기(2) (2) | 2025.02.19 |
|---|---|
| [MYSQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2025.02.04 |
| [MySQL] 프로그래머스 - 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (0) | 2024.06.25 |
| [MySQL] - Placements (0) | 2024.02.08 |
| [MySQL] HackerRank - Weather Observation Station 20 (2) | 2024.01.16 |