본문 바로가기

Skill Sets/SQL

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

SMALL

안녕하세요! 데코입니다!

오늘은 프로그래머스 코딩테스트 연습에 있는 "자동차 대여 기록에서 장기/단기 대여 구분하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/151138)

1. 문제 :  자동차 대여 기록에서 장기/단기 대여 구분하기(Lv. 1)

2. 문제 설명

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은
 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다.
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_RENTAL_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의 경우 예시의 데이트 포맷과 동일해야 정답처리 됩니다.)

3. 문제 풀이

# 1안
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

이번 문제는 1안 한 가지로 작성했습니다!

#  1안 풀이 설명

# [ 문제 접근 설명 ]

문제에서 요구한 사항을 정리하면 아래 3가지로 요약됩니다.

1. 대여 시작일이 2022년 9월인 기록에 대해서

2. 대여 기간이 30일 이상인 경우 "장기 대여" 그렇지 않으면 "단기 대여"로 구분('RENT_TYPE' 컬럼)

3. 데이트 포맷은 예시와 동일하게 나타내기(2023-01-18와 같은 형식)

4. 대여 기록 ID 기준으로 내림차순하기

 

# [ 1안 쿼리 작성 설명 ]

CAR_RENTAL_COMPANY_RENTAL_HISTORY의 테이블을 이용하여

[출력 결과]에 나와 있는 컬럼들과 동일한 순서로 나타내게 작성하였고

 

" SELECT "문에서 날짜 관련 컬럼의 출력 포맷을 변경하였습니다.(3번 해결)

 

" SELECT "문에서 CASE 문을 통해 'RENT_TYPE' 컬럼을 생성하였습니다.(2번 해결)

한 가지 유의할 점은 오늘 대여하고 오늘 반납해도 대여 기간은 하루이기 때문에

(END_DATE - START_DATE ) + 1 >= 30으로 계산했습니다.

# 대여 기간 예시 1 )
2023년 1월 18일 대여  >>  2023년 1월 18일 반납  :  1일
= (18일 - 18일) + 1일
= 1일

# 대여 기간 예시 2 )
2023년 1월 18일 대여  >>  2023년 1월 19일 반납  :  2일
= (19일 - 18일) + 1일
= 2일

" WHERE "문에서 2022년 9월의 데이터만을 필터링하였습니다.(1번 해결)

 

이후 " ORDER BY {컬럼} DESC" 을 통해 'HISTORY_ID' 컬럼을 기준으로 내림차순 정렬

이렇게 쿼리를 작성했습니다!


4. 데코의 문제 풀이 후기

이번 문제는 CASE 문을 통해 조건에 따라 새로운 컬럼을 구성하고 DATE 포맷을 변경하는 문제예요!

 

CASE문은 문제에서 보신 것과 같이 조건에 따라

새로운 값을 부여하여 새로운 컬럼을 부여하는 경우에 사용해요!

 

CASE문의 기본 형식은 아래와 같아요!

CASE
WHEN 조건 1
THEN ‘조건 1 만족 시 반환하는 값’
WHEN 조건 2
THEN ‘조건 2 만족 시 반환하는 값’
ELSE ‘조건들에 만족 안 하는 경우 반환 값’
END 

제 경우에는 조건에 따라 데이터를 파악할 때 CASE문을 이용해서 조회했었어요!

(python이 더 편해서 python으로 작업한 경우가 더 많지만요...!)

 

 

다음은 날짜 데이터 출력 형식입니다.

MySQL에서 DATE_FORMAT() 함수를 이용해서 날짜를 원하는 형식으로 변경해 줄 수 있어요!

 

DATE_FORMAT() 함수의 기본 형식은 아래와 같아요!

DATE_FORMAT(날짜, 형식)

형식 관련 옵션은 아래 이미지에서 볼 수 있듯이 매우 다양하게 존재합니다!

이미지 출처 : https://phoenixnap.com/kb/mysql-date-function

이 많은 걸 다 암기할 수는 없잖아요...!

대부분의 날짜 데이터는 '%Y-%m-%d' 형식을 많이 이용해요!

 

'%Y-%m-%d' 형식을 암기하고 이후에 분석 과정에서 특별하게 원하는 포맷이 있다면

그때 공식 문서 혹은 구글링을 통해 포맷을 변경하는 걸 추천해요!

(날짜 형식 말고도 암기해야 하는 건 많으니까요...!)

 

이번 문제는 CASE 문을 통해 조건에 따라 새로운 컬럼을 구성하고 DATE 포맷을 변경하는 문제를 풀어봤습니다!

 

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분은 그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해드릴게요!

공감과 댓글은 큰 힘이 됩니다!
읽어주셔서 감사해요!

 

또 다른 SQL 문제로 찾아뵐게요!

LIST