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

Ray·2025년 6월 10일

SQL

목록 보기
32/39

🔎 문제설명

  • 출처: 프로그래머스
  • 사용언어(RDBMS): SQL(MySQL)
  • 문제:

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




✅ 제출답안

# 답안1 - 처음 풀었을 때(다른 풀이 참고)
SELECT CAR_ID, 
       CASE WHEN MAX('2022-10-16' BETWEEN START_DATE AND END_DATE) THEN '대여중'
            ELSE '대여 가능'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
# 답안2 - 다시 풀었을 때 
SELECT CAR_ID,
       IF(SUM(AVAILABILITY) = 0, '대여 가능', '대여중') AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H JOIN (SELECT CAR_ID, IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16', 1, 0) AS AVAILABILITY
                                               FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                                            ) A USING(CAR_ID)
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;



🚀 풀이기록

1. 답안1

CASE WHEN MAX('2022-10-16' BETWEEN START_DATE AND END_DATE) 
     THEN '대여중' ELSE '대여 가능' END AS AVAILABILITY

START_DATE와 END_DATE 사이에 2022년 10월 16일이 있는지 여부에 따라 대여중과 대여 가능으로 나뉜다. 만약에 CAR_ID가 1인 자동차에 대해 AVAILABILITY속성의 값이 ‘대여중’인 행과 ‘대여 가능’행이 모두 존재할 수 있다. 이런 경우, 2022-10-16에 대여가 되었다는 것이므로, MAX()를 사용해 AVAILABILITY속성이 대여 가능 값이 나오도록 출력해줘야 한다.

  • 대여 가능 을 써줄 때 꼭 띄어쓰기 하자. 안하면 틀린다.

2. 답안2

...
SELECT CAR_ID, 
	   IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16', 1, 0) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
...                                    

JOIN을 쓰지 않고 바로 GROUP BY문을 사용해서 쿼리를 작성하고 싶었다. 그런데 2022년 10월 16일에 대여중이라는 사실을 알려면 행마다 대여가능표시를 해야할 거 같아, 각 행마다 만약 대여중인 경우는 1, 그렇지 않은 경우는 0을 표시한 컬럼(AVAILABILITY)을 추가해 JOIN을 해주었다. JOIN 후 CAR_ID별로 묶어준 뒤 만약 대여가능여부(AVAILABILITY) 컬럼의 합이 1이상이면 대여중, 그렇지 않으면 대여 가능으로 표시되게 했다.

답안1이 조인을 사용하지 않고, 연산이 더 적어 더 좋은 쿼리문인 거 같다. 근데 막상 문제 풀면 저렇게 안된단말이지...

profile
미래의 독자인 나를 위해 글을 씁니다.

0개의 댓글