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 |
- 작성코드
--