문제 풀이/프로그래머스 SQL

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

열심히 해 2024. 10. 29. 09:43

https://school.programmers.co.kr/learn/courses/30/lessons/157340

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

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

 

 

위에서는 **GROUP BY CAR_ID** 를 이용하여 중복되는 CAR_ID의 중복을 제거하고, 집계 함수**MAX()**를 통해 나머지 칼럼의 중복을 제거합니다.

 

 

 

SELECT CARS.CAR_ID, CASE WHEN RENTED.CAR_ID IS NULL THEN '대여 가능'
                         ELSE '대여중' 
                         END AS AVAILABILITY
FROM (SELECT DISTINCT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY) AS CARS
     LEFT JOIN 
     (SELECT CAR_ID 
     FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
     WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE
     ) AS RENTED 
     ON CARS.CAR_ID = RENTED.CAR_ID
ORDER BY CARS.CAR_ID DESC

 

CARS 서브쿼리의 **SELECT DISTINCT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY**를 통해 

CAR_ID의 중복을 제거한 CAR_ID 목록을 반환합니다.

 

RENTED 서브쿼리에서는 2022-10-16에 대여 중인 차량(START_DATE와 END_DATE 사이에 있는 차량)의 CAR_ID 목록을 반환합니다.

 

CARS와 RENTED를 CAR_ID 기준으로 LEFT JOIN하여, CARS에 있는 모든 차량 목록을 기준으로 RENTED와 매칭합니다.

RENTED.CAR_ID가 NULL이라면 해당 CAR_ID는 대여 가능으로 표시됩니다. NULL이 아니라면 대여중으로 표시됩니다.