코딩테스트

[26.03.13 코테/회고(MySQL/Oracle)]-자동차 대여 기록에서 대여중/대여 가능 여부 구분하기

지니248 2026. 3. 13. 13:16

Lv3. 자동차 대여 기록에서 대여중/대여 가능 여부 구분하기 (MySQL)

링크: https://school.programmers.co.kr/learn/courses/30/lessons/157340?language=mysql

 

내가 작성한 코드

SELECT CAR_ID,
MAX(CASE WHEN START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' THEN '대여중' ELSE '대여 가능' END) AS ABAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

-- 한 자동차(CAR_ID)당 여러 개의 대여 기록이 존재함
-- GROUP BY로 자동차별로 묶으면 '대여중'과 '대여 가능' 기록이 섞일 수 있음
-- 문자열 순서 상 '대여중'이 '대여 가능'보다 크므로 MAX를 사용해 하나라도 '대여중'이 있으면 '대여중'이 출력되도록 우선순위를 결정

 

Oracle

SELECT CAR_ID,
MAX(CASE WHEN START_DATE <= TO_DATE('2022-10-16', 'YYYY-MM-DD') AND END_DATE >= TO_DATE('2022-10-16', 'YYYY-MM-DD') THEN '대여중' ELSE '대여 가능' END) AS ABAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

문제 회고

1. MAX 사용

- 처음에 MAX를 사용하지 않고 CASE구문만 사용했을 때 틀린 결과가 나옴

- 제미나이를 활용해 틀린 부분과 이유를 찾아냄

- 이유: 

   - 한 자동차(CAR_ID)당 여러 개의 대여 기록이 존재하여

   - GROUP BY로 자동차 별로 묶으면 '대여중'과 '대여 가능' 기록이 섞일 수 있음

   -  문제에서  반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시  라고 했으므로 MAX() 함수를 사용하여 하나라도

      '대여중'이 있으면 '대여중'으로 출력하도록 해야함

- 배운점:

   - MAX() 함수로 우선순위 결정이 가능하다

   - '대여중'을 뽑고자 하였으므로 MAX()를 사용했지만, 반대로 '대여 가능'을 뽑고자 하였으면 MIN()을 사용해야 함

   - 문제를 끝까지 잘 읽어야겠다