포스트

자동차 대여 기록에서 대여중 • 대여 가능 여부 구분하기

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함수는 문제의 요구대로 문자열 ‘대여중’을 반환한다.
        1. CAR_ID에 대해 해당하는 대여 기간을 확인하고, ‘대여중’인 경우에는 ‘대여중’, 그렇지 않은 경우에는 ‘대여 가능’으로 표시한다.
        2. 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 라이센스를 따릅니다.