자동차 대여 기록에서 대여중 • 대여 가능 여부 구분하기
https://school.programmers.co.kr/learn/courses/30/lessons/157340
- 문제 풀이
- 서브쿼리를 사용하여 주어진 날짜 범위에 따라 대여 중인지 여부를 결정
1 2 3 4 5 6 7 8 9 10 11
SELECT DISTINCT(CAR_ID), CASE WHEN CAR_ID IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE TO_CHAR(START_DATE, 'YYYY-MM-DD') <= '2022-10-16' AND TO_CHAR(END_DATE, 'YYYY-MM-DD') >= '2022-10-16') THEN '대여중' ELSE '대여 가능' END AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY ORDER BY CAR_ID DESC;
MAX
함수는 그룹화된 결과에 대해 가장 큰 값을 찾는다.1 2 3 4 5 6 7 8 9 10
SELECT CAR_ID, MAX(CASE WHEN START_DATE <= TO_DATE('2022-10-16', 'YYYY-MM-DD') AND NVL(END_DATE, TO_DATE('9999-12-31', 'YYYY-MM-DD')) >= TO_DATE('2022-10-16', 'YYYY-MM-DD') THEN '대여중' ELSE '대여 가능' END) AS "AVAILABILITY" FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY GROUP BY CAR_ID ORDER BY CAR_ID DESC;
- 오라클에서 한글 문자열을
MAX
함수로 비교할 때, 유니코드의 사전순으로 결정되는데 이때 문자열 ‘대여중’이 ‘대여 가능’보다 더 큰 값을 가지게 된다. - 따라서 그룹화된 CAR_ID에 대해 문자열 ‘대여중’과 ‘대여 가능’이 중첩된 경우
MAX
함수는 문제의 요구대로 문자열 ‘대여중’을 반환한다.- 각
CAR_ID
에 대해 해당하는 대여 기간을 확인하고, ‘대여중’인 경우에는 ‘대여중’, 그렇지 않은 경우에는 ‘대여 가능’으로 표시한다. MAX
함수를 사용하여 그룹화된 결과에서 각CAR_ID
에 대한 최대 값을 선택한다. 이때 ‘대여중’이 ‘대여 가능’보다 사전순으로 더 큰 값으로 간주되므로, ‘대여중’이 하나라도 포함된 경우 해당CAR_ID
에 대해 ‘대여중’으로 최종 결과를 결정한다.
- 각
- 오라클에서 한글 문자열을
- 오답
- 날짜 형식이 일치하지 않을 때 발생하는 오류이다. ‘2022-10-16’과 같은 문자열은 Oracle에서는 DATE 형식으로 변환할 수 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
SELECT DISTINCT(CAR_ID), CASE WHEN CAR_ID IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16') THEN '대여중' ELSE '대여 가능' END AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY ORDER BY CAR_ID DESC; -- SQL 실행 중 오류가 발생하였습니다. -- ORA-01861: literal does not match format string
- 실행 결과
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.