본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 자동차 대여 기록에서 장기/단기 대여 구분하기

by kime2 2024. 1. 25.
출처
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

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

문제에 대한 해석

-- 조건: 대여 시작일이 2022년 9월
-- 출력: 전체+대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여'(RENT_TYPE) 추가
-- 정렬: 대여 기록 ID 내림차순

풀이(MYSQL)

select history_id, car_id, start_date, end_date,
    case when datediff(end_date, start_date)+1 >=30 then '장기 대여'
    else '단기 대여' end as RENT_TYPE
from 
(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 
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where start_date like '2022-09%')a
order by history_id desc

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 

  1. 서브쿼리: CAR_RENTAL_COMPANY_RENTAL_HISTORY테이블에서  start_date 이 2022-09을 포함하는 데이터 필터링 하여 history_id, car_id 조회하고 start_date,end_date를 date_format을 통해 %Y-%m-%d'형태로 변경하여 조회
  2. FROM 절: 서브쿼리 절에서
  3. SELECT 절: history_id, car_id, start_date, end_date을 조회하고 datediff를 통해 end_date, start_date차이 +1이 30 이상일 경우 '장기 대여' 아닐경우 '단기 대여'로 출력하여 컬럼명을  RENT_TYPE으로 지정
  4. ORDER BY 절: history_id내림차순
  5. 결과반환: 기존테이블에서 RENT_TYPE컬럼 추가

 

다른사람 풀이

SELECT 
history_id, car_id,
date_format(start_date, '%Y-%m-%d') start_date,
date_format(end_date, '%Y-%m-%d') end_date,
if(datediff(end_date, start_date) >= 29, '장기 대여', '단기 대여') rent_type_flag
from car_rental_company_rental_history 
where date_format(start_date, '%Y%m') = '202209'
order by history_id desc

배운점

  • datediff(최신날짜, 이전날짜)는 최신날짜(예: 1/30) - 이전날짜(1/1)르 계산하여 29가 출력된다. 대여시작일이 1/1로 1/1부터 대여기간을 산정하기 위해서는 datediff의 차이에다가 +1을 해야한다
  • start_date like '2022-09%' = date_format(start_date, '%Y%m') = '202209'