관리 메뉴

물 만날 물고기

[프로그래머스/SQL] - (13) 자동차 대여 기록에서 장기/단기 대여 구분하기 본문

DB & SQL/프로그래머스

[프로그래머스/SQL] - (13) 자동차 대여 기록에서 장기/단기 대여 구분하기

Lung Fish 2023. 6. 24. 10:48

🔍 예상 검색어

더보기

# 프로그래머스

# SQL

# 자동차 대여 기록에서 장기/단기 대여 구분하기

 


 

해당 포스팅은 프로그래머스 SQL "자동차 대여 기록에서 장기/단기 대여 구분하기"  문제에 대한 풀이를 정리하였습니다.

 

▶ 문제

코딩테스트 연습 - 자동차 대여 기록에서 장기/단기 대여 구분하기 | 프로그래머스 스쿨

 

프로그래머스

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

programmers.co.kr

 

▶ 내 정답

-- 코드를 입력하세요
-- 문제 조건 적용 체크하면서 진행

-- CAR_RENTAL_COMPANY_RENTAL_HISTORY 
-- HISTORY_ID, CAR_ID, START_DATE, END_DATE

/* 문제조건
(1) 대여 시작일이 2022년 9월에 속하는 대여 기록
(2) 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시 => 컬럼명: RENT_TYPE을 추가
(3) 대여 기록 ID를 기준으로 내림차순 정렬
(주의사항) START_DATE와 END_DATE의 경우 예시의 데이트 포맷과 동일
*/

-- 결과 테이블 : HISTORY_ID, CAR_ID, START_DATE, END_DATE, RENT_TYPE(+NEW)


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 -- (2)
    WHEN DATEDIFF(END_DATE,START_DATE)+1 >= 30 THEN "장기 대여"
    ELSE "단기 대여"
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE DATE_FORMAT(START_DATE, "%Y-%m") = "2022-09" -- (1)
ORDER BY HISTORY_ID DESC -- (3)

 

▶ 다른 사람 정답 (1) 

/*
목적 : 자동차 대여 기록에서 장기/단기 대여 구분하기
아웃풋 : 대여 기록 ID,RENT_TYPE
조건
1.대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서
2.대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)
3.대여 기록 ID를 기준으로 내림차순 정렬

*/

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 >= '2022-09-01 00:00:00' AND start_date < '2022-10-01 00:00:00'
ORDER BY history_id DESC

내 정답과 비슷하지만 where절에서 time stamp 형식 + 수기로 직접 입력한 부분은 조금 아쉬어 보인다. 

 

 

▶ 다른 사람 정답 (2)

select 
    history_id, 
    car_id, 
    date_format(start_date, '%Y-%m-%d') start_date, 
    date_format(end_date, '%Y-%m-%d') end_date,
    IF (timestampdiff(day, start_date, end_date) < 29, '단기 대여', '장기 대여') rent_type
from 
    car_rental_company_rental_history
where 
    date_format(start_date, '%Y%m')='202209'
order by 
    1 desc

이분은 기준일을 30일이 아닌 30-1일로 주었고, "단기대여"와 "장기대여"만 있다는 것을 고려해서 IF문으로 처리하는 방법을 사용한 것으로 확인하였다. 

 

 

▶ 다른 사람 정답(3)

-- 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY

SELECT 
    *, 
    CASE 
        WHEN (MONTH(start_date) = MONTH(END_DATE)) AND (RIGHT(END_DATE, 2) - RIGHT(start_date, 2) >= 29) THEN '장기 대여'
        WHEN (MONTH(END_DATE) = 10) AND (30-RIGHT(start_date, 2)+RIGHT(END_DATE, 2)>=29) THEN '장기 대여'
        WHEN MONTH(END_DATE) > 10 THEN '장기 대여'
        WHEN YEAR(END_DATE) >= 2023 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 DATE_FORMAT(start_date, '%Y-%m') = '2022-09') T1
ORDER BY HISTORY_ID DESC

 

 

▼ 참고자료

No. 내용 비고
1 my sql 정답 | 프로그래머스 스쿨 김병윤2023.5.5 17:41
2 mysql 정답 공유! | 프로그래머스 스쿨 김민우2023.2.10 02:08
3 다소 긴 버전 정답(MySQL) | 프로그래머스 스쿨 herb2023.2.10 11:11

 


 

▼ 복습/히스토리

더보기
No. 복습일 비고
1    
2    
3    
4    
5    

- 작성코드

--