출처\
문제
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
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의 사용
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] 자동차 대여 기록에서 장기/단기 대여 구분하기 (1) | 2024.01.25 |
---|---|
[문제풀이] 취소되지 않은 진료 예약 조회하기 (1) | 2024.01.24 |
[문제풀이] 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2024.01.22 |
[문제풀이] 조건에 맞는 사용자 정보 조회하기- 배운점 추가하기 (0) | 2024.01.22 |
[문제풀이] 특정 옵션이 포함된 자동차 리스트 구하기 (0) | 2024.01.22 |