Jay의 개발블로그

적다보면 언젠가 늘어있을 내 실력

Programming/SQL

Programming/SQL프로그래머스 SQL 레벨 1 - 자동차 대여 기록에서 장기/단기 대여 구분하기

Jay_on_Day 2025. 8. 23. 22:43
반응형
 

프로그래머스

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

programmers.co.kr

 

문제의 출처는 위의 링크이다.

 


문제 설명

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY 테이블입니다. 

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

Column name Type Nullable
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

문제

CAR_RENTAL_COMPANY_RENTEAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여'로 표시하는 컬럼(컬럼명 : RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.


예시

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

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

 

2022년 9월의 대여 기록 중 '장기 대여' 에 해당하는 기록은 대여 기록 ID가 1,4인 기록이고, '단기 대여' 에 해당하는 기록은 대여 기록 ID가 3,5 인 기록이므로 대여 기록 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야합니다.

HISTORY_ID CAR_ID START_DATE END_DATE RENT_TYPE
5 3 2022-09-16 2022-10-13 단기 대여
4 1 2022-09-01 2022-09-30 장기 대여
3 2 2022-09-05 2022-09-05 단기 대여
1 4 2022-09-27 2022-10-26 장기 대여

주의사항

START_DATE 와 END_DATE의 경우 예시의 데이트 포맷과 동일해야 정답처리 됩니다.


내가 작성한 코드

select HISTORY_ID
        , CAR_ID
        , DATE_FORMAT(START_DATE, "%Y-%m-%d") as START_DATE
        , DATE_FORMAT(END_DATE, "%Y-%m-%d") as END_DATE
        , case when DATEDIFF(END_DATE, START_DATE) + 1 >= 30 
        then "장기 대여" else "단기 대여" end as RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where START_DATE between '2022-09-01' and '2022-09-30'
order by HISTORY_ID desc

 


이렇게 풀어낸 과정과 이유

새로운 열을 만들어서 조건에 맞게 조회되도록 하는 기능에 대한 쿼리를 알아야 했다.

그런 쿼리를 이제 Case when ~ then ~ else ~ end 쿼리이다.

case when 조건1 then 결과1,
	when 조건2 then 결좌2,
    else 결과3 end as 컬럼명

 

이렇듯 조건에 맞으면 그 조건의 짝인 결과들을 통해 값들이 만들어지게 되는 것이다.

 

DATEDIFF의 경우에는 DATE 타입들의 값들 사이의 기간을 나타내는 것이다. 하지만 START_DATE와 END_DATE를 지정하게 되면 단지 몇일 사이인지를 나타내기 떄문에 START_DATE가 제외되기 때문에 +1 을 붙여준다.

결과는 다음과 같이 출력된다.

밑에 추가 행들이 더 있다.


결과

반응형