본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

by kime2 2024. 1. 24.
출처\
 

프로그래머스

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

programmers.co.kr

 

문제

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

문제에 대한 해석

--  2022년 10월 16일에 대여 중인/또는 반납 자동차인 경우 '대여중'
--  대여 중이지 않은 자동차인 경우 '대여 가능'(AVAILABILITY)
-- 조회: 자동차 id, AVAILABILITY
-- 정렬: id내림차순

 

2022년 10월 16일인 경우 대여 가능한 자동차 조회

 

풀이(MYSQL)

select car_id,
    max(case when '2022-10-16' between start_date 
        and end_date then '대여중'
 else '대여 가능' end )as AVAILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
group by car_id
order by car_id desc

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

  • FROM 절: CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 데이터를 가져옴
  • GROUP BY 절: car_id를 기준으로 그룹화하여 동일한 car_id를 하나로 집합시킴
  • HAVING 절:
  • SELECT 절: 그룹화된 car_id, case when 으로 출력된  AVAILABILITY( start_date와 end_date 사이에 2022-10-16가 포함될 경우 '대여중', 아닐경우 '대여 완료'로 표시, ➡️이때 between   start_date와 end_date 날짜를 모두 포함하므로, 2022-10-16가 start_date  end_date 경우도 대여중. ➡️ Max 집계함수를 사용하여 그룹화된 car_id에서 대여중> 대여 가능  사전적으로  크므로  아이디당 여러 값이 있을 경우  MAX값이 대여중으로 출력된다
  • ORDER BY 절:car_id의 오름차순으로 정렬
  • 결과반환: 2022-10-16을 기준으로 대여가능 차량과 대여중인 차량을 조회

 

궁금점

Q1. 반납날짜가 2022-10-16일 경우

A1. 대여중

select car_id,start_date ,end_date,
    case when '2022-10-16' between start_date 
        and end_date then '대여중'
 else '대여 가능' end as AVAILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
order by car_id desc

➡️그룹함수를 하지 않고 조회했을때 

select car_id, start_date ,end_date,
    max(case when '2022-10-16' between start_date 
        and end_date then '대여중'
 else '대여 가능' end )as AVAILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
group by car_id
order by car_id desc

 

➡️그룹함수를 하고 조회했을때 

 

 

Q2. 2022-10-16에는 대여가 가능하지만  그 이후 날짜는 대여중일 경우 Max함수 사용시 출력되는 값은?

A2. Max값인 대여중> 대여가능: 대여중으로 출력

 

 

select car_id,start_date ,end_date,
    case when '2022-10-16' between start_date
        and end_date then '대여중'
 else '대여 가능' end as AVAILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
order by car_id desc

➡️그룹함수를 하지 않고 조회했을때

 

 

select car_id, start_date ,end_date,
    max(case when '2022-10-16' between start_date
        and end_date then '대여중'
 else '대여 가능' end )as AVAILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
group by car_id
order by car_id desc

➡️그룹/MAX함수를 하고 조회했을때

다른사람 풀이

https://developevolvify.tistory.com/375

 

[SQL KIT] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기(설명/코드/정답)

문제 링크 :https://school.programmers.co.kr/learn/courses/30/lessons/157340 POINT. CASE/WHEN/THEN 사용 가능 '2022-10-16' BETWEEN START_DATE AND END_DATE 작성 가능 답. SELECT CAR_ID, MAX(CASE WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE TH

developevolvify.tistory.com

WITH A AS(
    SELECT
    CAR_ID, 
    '대여중' AS AVAILABILITY
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE
    )

SELECT 
    DISTINCT(C.CAR_ID),
    IFNULL(A.AVAILABILITY, '대여 가능')
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS C
LEFT JOIN A ON C.CAR_ID = A.CAR_ID
ORDER BY CAR_ID DESC;

배운점

  • between A and B 는 A이상 B이하와 동일하다
  • '2022-10-16' between start_date  and end_date의 사용