코딩테스트/SQL 코드카타

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

ANNASENA 2024. 9. 25. 08:00
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