728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/157340
내 풀이
틀린 풀이
SELECT CAR_ID,
CASE WHEN (END_DATE >= '2022-10-16' AND START_DATE < '2022-10-16') THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
처음에는 위와 같이 풀었다.
하나의 CAR_ID에 대하여 대여 기록이 여러개 있으므로, GROUP BY를 통해 그룹화를 해주었는데,
사실 풀면서도 뭔가 그룹화에 대한 조건이 필요할듯 했는데,
대여 기록을 기준으로 하기에도 애매하고, 뭔가 다 애매해서 단순하게 위와 같이 작성하였고,
역시 틀렸다ㅠㅠ
맞은 풀이
SELECT CAR_ID,
CASE
WHEN CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '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;
틀린 이유 1) 하나의 자동차 ID에 대하여 여러 개의 대여 기록이 있다.
이를 확인해보면, 2022-10-16에 대여중인 기록이 잡히지만,
그 기간이 아닌 날에는 대여 가능으로 뜬다.
즉, 하나의 자동차 ID에 대하여 대여 가능과 대여중이 모두 뜨는 것이다.
이를 고려하지 않고 그냥 나타내게 되면, 제대로 처리가 되지 않을 가능성이 있다.
따라서, SELECT 절에서 서브쿼리를 이용해 2022-10-16에 "대여중"에 해당하는 자동자 ID는 모두 "대여중"으로 바꿔주면 해결이 된다.
틀린 이유 2)
# 1
END_DATE >= '2022-10-16' AND START_DATE < '2022-10-16'
# 2
END_DATE >= '2022-10-16' AND START_DATE <= '2022-10-16'
'2022-10-16' BETWEEN START_DATE AND END_DATE
첫 번째 방법은 내가 작성했던 방법이다. 그러나 문제에서 2022년 10월 16일 경우에도 "대여중"으로 표시하라고 했으므로,
두 번째 방법과 같이 작성해줘야 한다.
참고로, BETWEEN 함수의 경우 양 끝 값이 포함되며, A 이상 B 이하인 범위를 나타낸다!
728x90
'코딩테스트 > SQL' 카테고리의 다른 글
[프로그래머스][MySQL] Lv. 4 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.08.07 |
---|---|
[프로그래머스][MySQL] Lv. 2 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2024.08.05 |
[프로그래머스][MySQL] Lv. 3 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.07.30 |
[프로그래머스][MySQL] Lv. 4 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.07.29 |
[프로그래머스][MySQL] Lv. 3 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.07.25 |