[프로그래머스_MySQL]자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

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

처음에는 반납일이 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_IDSTART_DATEEND_DATE
12022-10-032022-10-09
12022-10-172022-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인 값은 ‘대여 가능’, 그 외에는 ‘대여중’으로 표기하면 정답이 뜬다~~

profile
Data Analyst

0개의 댓글