https://school.programmers.co.kr/learn/courses/30/lessons/151138?language=oracle
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
SQL Oracle SELECT CASE WHEN THEN ELSE END 셀랙에서 조건 달기
If 문 방식 SELECT ename , deptno , CASE WHEN deptno = '10' THEN 'New York' WHEN deptno = '20' THEN 'Dallas' ELSE 'Unknown' END AS loc_name FROM emp WHERE job = 'MANAGER' CASE 표현식에서 ELSE 부분은 생략이 가능하며, 만족하는 조건이
chord.tistory.com
자동차 대여 기록에서 장기/단기 대여 구분하기
문제 설명
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 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의 경우 예시의 데이트 포맷과 동일해야 정답처리 됩니다.
-- 코드를 입력하세요
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;
+1을 해주는 이유
START_DATE 2022-09-29 - END_DATE 2022-09-29 = 0 이 나오고
START_DATE 2022-09-29 - END_DATE 2022-10-28 인경우
29, 30, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28 로 30 이지만 값이 29로 나오기 때문에 +1을 해줘야 한다.
대여 당일은 대여일에 추가 되지 않아서 +1
'SQL > SQL 코딩테스트' 카테고리의 다른 글
| SQL Oracle SELECT MIN() (0) | 2024.02.07 |
|---|---|
| SQL Oracle 조인 (1) | 2024.02.06 |
| SQL Oracle WHERE 컬럼 LIKE '%네비%' 컬럼안에 네비라는 문자열이 포함되었는가 (0) | 2024.02.02 |
| SQL Oracle SELECT MAX() , MIN() (1) | 2024.02.01 |
| SQL Oracle JOIN (0) | 2024.01.31 |