프로그래머스
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 을 붙여준다.
결과는 다음과 같이 출력된다.
결과
'Programming > SQL' 카테고리의 다른 글
Programming/SQL프로그래머스 SQL 레벨 1 - 흉부외과 또는 일반외과 의사 목록 출력하기 (3) | 2025.07.24 |
---|---|
프로그래머스 SQL 레벨 1 - 경기도에 위치한 식품창고 목록 출력하기 (4) | 2025.07.22 |
프로그래머스 SQL 레벨 1 - 조건에 맞는 회원 수 구하기 (3) | 2025.07.21 |