출처
문제
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 ->결과반환
- 서브쿼리: CAR_RENTAL_COMPANY_RENTAL_HISTORY테이블에서 start_date 이 2022-09을 포함하는 데이터 필터링 하여 history_id, car_id 조회하고 start_date,end_date를 date_format을 통해 %Y-%m-%d'형태로 변경하여 조회
- FROM 절: 서브쿼리 절에서
- SELECT 절: history_id, car_id, start_date, end_date을 조회하고 datediff를 통해 end_date, start_date차이 +1이 30 이상일 경우 '장기 대여' 아닐경우 '단기 대여'로 출력하여 컬럼명을 RENT_TYPE으로 지정
- ORDER BY 절: history_id내림차순
- 결과반환: 기존테이블에서 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'
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] 자동차 평균 대여 기간 구하기 (1) | 2024.01.26 |
---|---|
[문제풀이] 서울에 위치한 식당 목록 출력하기 (1) | 2024.01.25 |
[문제풀이] 취소되지 않은 진료 예약 조회하기 (1) | 2024.01.24 |
[문제풀이] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.01.24 |
[문제풀이] 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2024.01.22 |