MySQL 프로그래머스 | 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

    728x90

     

    문제

    https://school.programmers.co.kr/learn/courses/30/lessons/157340#qna

     

    프로그래머스

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

    programmers.co.kr

    • 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가
      • 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시
    • 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성
    • 결과는 자동차 ID 기준 내림차순 정렬

     

    테이블

    CAR_RENTAL_COMPANY_RENTAL_HISTORY

     

     

    풀이과정

    # '2016-10-16' 날짜를 포함하지 않으면 '대여중', 포함하면 '대여 가능'

    • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블을 보면 한 개의 CAR_ID 당 여러 번의 대여-반납이 이루어지고 있음
      • 처음에 헷갈렸던 부분은 '2016-10-16' 이후에라도 반납이 돼서 현재 대여가 가능해진 자동차들도 '대여 가능'이라고 표시하는 것인줄 알았음
      • 그게 아니라 '2016-10-16' 이라는 이 날짜 당일을 기준으로 '대여중'과 '대여 가능'을 구분하는 문제였던 것!
    • START_DATE와 END_DATE가 '2022-10-16'을 포함하고 있으면 '대여중'인 것으로 표시
    • SUM 함수 안
      • START_DATE와 END_DATE가 조건에 부합하면 True기 때문에 1을 반환
      • START_DATE와 END_DATE가 조건에 부합하지 않으면 False기 때문에 0을 반환
    • SUM() 대신 MAX 함수를 사용해도 정답 처리 됨.
      • MIN 함수는 안 됨. MIN을 사용하면 조건에 부합하든, 부합하지 않든 모두 0을 출력하게 되기 때문

     

    # 정답

    IF문 안의 SUM함수 결과 IF문 참, 거짓을 '대여중', '대여 가능'으로 설정 (정답)
    SELECT CAR_ID,
                    IF(SUM(START_DATE <='2022-10-16' 
                         AND  END_DATE >='2022-10-16'),
                         SUM(START_DATE <='2022-10-16' 
                         AND END_DATE >='2022-10-16'),
                         SUM(START_DATE <='2022-10-16'
                         AND END_DATE >='2022-10-16'))
                         AS AVAILABILITY
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    GROUP BY CAR_ID
    ORDER BY CAR_ID DESC
    SELECT CAR_ID,
                    IF(SUM(START_DATE <='2022-10-16'
                         AND END_DATE >='2022-10-16')
                        ,'대여중', '대여 가능') AS AVAILABILITY
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    GROUP BY CAR_ID
    ORDER BY CAR_ID DESC

     

    728x90

    댓글