OkBublewrap

자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 본문

개발/SQL

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

옥뽁뽁 2023. 3. 12. 11:41

<문제>

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

 

<예시>
예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

HISTORY_ID CAR_ID  START_DATE END_DATE
1 4 2022-09-27 2022-09-27
2 3 2022-10-03 2022-10-04
3 2 2022-10-05 2022-10-05
4 1 2022-10-11 2022-10-16
5 3 2022-10-13 2022-10-15
6 2 2022-10-15 2022-10-17


2022년 10월 16일에 대여 중인 자동차는 자동차 ID가 1, 2인 자동차이고, 대여 가능한 자동차는 자동차 ID가 3, 4이므로, '대여중' 또는 '대여 가능' 을 표시하는 컬럼을 추가하고, 자동차 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야 합니다.

CAR_ID  AVAILABILITY
4 대여 가능
3 대여 가능
2 대여중
1 대여중

 

<풀이>

START_DATE와 END_DATE 사이에 '2022-10-13'이 만족하면 될 것 같다. 이 사이에 있다면 대여중이고 없다면 대여 가능으로 표시하면 될 것 같다. 그룹화는 CAR_ID로 하면 된다. 우선 IF절로 대여가능, 대여중을 출력을 했다

SELECT CAR_ID, START_DATE, END_DATE,
    IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' ,'대여중', '대여가능')
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC


30 2022-10-27 00:00:00 2022-10-27 00:00:00 대여가능
29 2022-08-02 00:00:00 2022-08-05 00:00:00 대여가능

 

1)

일부분만 봤을 때 10-26이 중간에 있지 않기 때문에 올바르게 나왔다. 다음은 어떻게 진행을 할지 고민을 해봐야하는데

저 쿼리을 작성했을 때 여러가지 CAR_ID가 나오는데 그 중에 하나라도 대여중이 있으면 대여중으로 표시하고 하나도 없으면 대여가능으로 출력을 하면 될 것 같다.

 

2)

CAR_ID을 중복제거를 해봤다. 

SELECT DISTINCT(CAR_ID),
   IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' ,'대여중', '대여가능') AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC

여기서 MAX나 MIN을 사용해서 하나만 뽑아오면 값이 나올 것 같다.

 

3)

CAR_ID AVAILABILITY
30 대여가능
29 대여가능
29 대여중

car_id : 29는 대여중으로 나와야 된다. 계속 오답처리가 되길래 봤더니 '대여 가능' 띄어쓰기를 안하고 있었다.

 

SELECT CAR_ID, 
   MAX(IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' ,'대여중', '대여 가능')) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
ORDER BY CAR_ID DESC

DISTINCT를 써도 안써도 상관은 없었다.