[SQL] Programmers - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 <CASE, GROUP BY, SUBQUERY>
2023. 4. 10. 16:10ㆍ공부/SQL
Problem
Solution
CASE문을 사용하면 쉽게 해결이 가능 할 줄 알았다.
SELECT
CAR_ID,
# DATE_FORMAT(END_DATE, '%Y-%m-%d'),
CASE
WHEN DATE_FORMAT(END_DATE, '%Y-%m-%d') < '2022-10-16'
THEN '대여 가능'
ELSE '대여중'
END AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
하지만 이 쿼리문에서 문제는 CASE 문의 조건에 있는데, 같은 CAR_ID라도, 여러번 대여가 가능한데 AVAILABLILITY는 그걸 반영하지 못함.
예시를 들자면, 2022-09-30 에 김옥냥이라는 친구가 CAR_ID = 3 인 자동차를 대여해서 2022-10-05일에 반납을 완료했지만, 김뚱땅이라는 친구가 같은 차량을 2022-10-08일날 다시 대여를해서 2022-10-30일에 반납 하려고한다면, 이 쿼리문은 END_DATE<2022-10-16 이 유효하므로 대여 가능이라는 문자열을 반환할 것이다.
그러면 CASE문의 조건을 바꿔야 할 것이다
CASE 문의 조건이 START_DATE < 2022-10-16 < END_DATE 일 경우에는 김옥냥이 2022-10-05에 반납을 하였어도, 김뚱땅이라는 친구의 START_DATE가 2022-10-08이고 END_DATE가 2022-10-30이므로 새로운 CASE문의 조건에 포함되기 때문에 대여중이라는 결과를 반환할 것이다.
이 CASE문의 조건을 반영한 쿼리문을 다시 작성해보자
SELECT
CAR_ID,
CASE
WHEN CAR_ID
IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE('2022-10-16') BETWEEN START_DATE AND END_DATE
)
THEN '대여중'
ELSE '대여 가능'
END AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
'공부 > SQL' 카테고리의 다른 글
[SQL] Programmers - 자동차 대여 기록별 대여 금액 구하기 (0) | 2023.04.11 |
---|---|
[MySQL] DATE_FORMAT (0) | 2023.04.10 |
[SQL] Programmers - 서울에 위치한 식당목록 출력하기 <GROUP BY, INNER JOIN, WHERE> (0) | 2023.04.10 |
[SQL] Programmers - 중성화 여부 파악하기 (0) | 2023.04.09 |
[SQL] Programmers - 루시와 엘라 찾기 <REGEXP> (0) | 2023.04.09 |