코딩테스트연습/[프로그래머스] Oracle

[프로그래머스] Oracle Lv.1 - 자동차 대여 기록에서 장기/단기 대여 구분하기

_꼬마돌 2023. 8. 25. 21:21
반응형

[프로그래머스] Oracle Lv.1 - 자동차 대여 기록에서 장기/단기 대여 구분하기

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

프로그래머스

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

programmers.co.kr

 

문제

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

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

예시

예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

2022년 9월의 대여 기록 중 '장기 대여' 에 해당하는 기록은 대여 기록 ID가 1, 4인 기록이고, '단기 대여' 에 해당하는 기록은 대여 기록 ID가 3, 5 인 기록이므로 대여 기록 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야 합니다.

START_DATE와 END_DATE의 경우 예시의 데이트 포맷과 동일해야 정답처리 됩니다.

 

풀이

틀린 답,,

SELECT *
,      CASE 
           WHEN (END_DATE - START_DATE) >= 30 THEN '장기 대여'
           ELSE '단기 대여'
       END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_CHAR(START_DATE, 'YYYY-MM') = '2022-09'
ORDER BY HISTORY_ID DESC;
모든 컬럼을 다 불러오고 RENT_TYPE 컬럼을 새로 추가하면 될거라 생각했는데 이렇게 하면 안 되나보다..
그리고 END_DATE - START_DATE만 했는데 +1을 해줘야 한다고 한다. 
내가 이해한 대로는 예를 들어 대여 시작일이 2023-09-01이고 종료일 2023-09-30일때, 종료일에서 시작일을 빼면 29가 돼서 하루가 사라져 버리기 때문이다. 근데 아직도 긴가민가 헷갈린다.

CASE문을 사용하여 열심히 계산한 렌트 기간을 장기 단기로 구분하도록 했다. CASE문은 조건에 따라 다른 값을 반환하거나 연산을 수행할 때 사용되는 표현식이다. 데이터를 변환하거나 분류할 때 사용하는데, 자바의 if같은 녀석인 것 같다. 
CASE
    WHEN condition_1 THEN result_1 -- 만약 condition_1이 참이라면 result_1 반환
    WHEN condition_2 THEN result_2 -- 만약 condition_2가 참이라면 result_2 반환
    ...
    ELSE default_result            -- 위의 조건이 모두 거짓인 경우 defaul_result 반환
END                                -- CASE문의 끝을 나타내는 키워드
END 뒤에 꼭 'AS 컬럼명' 넣어주자..! AS로 컬럼명을 지정해주지 않아도 채점했을 때 틀리진 않지만 컬럼명을 지정하지 않으면 CASE문 전체가 컬럼명으로 들어간다. 

 

소스코드

SELECT HISTORY_ID
,      CAR_ID
,      TO_CHAR(START_DATE, 'YYYY-MM-DD') AS START_DATE
,      TO_CHAR(END_DATE, 'YYYY-MM-DD') AS END_DATE
,      CASE 
           WHEN (END_DATE - START_DATE + 1) >= 30 THEN '장기 대여'
           ELSE '단기 대여'
       END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_CHAR(START_DATE, 'YYYY-MM') = '2022-09'
ORDER BY HISTORY_ID DESC;
반응형