코딩테스트 연습 > GROUP BY > 자동차 대여 기록에서 대여중/대여 가능 여부 구분하기
MySQL의 CASE-WHEN-THEN과 GROUP BY를 함께 연습할 수 있는 문제이다.
먼저 CASE-WHEN-THEN은 아래의 형식을 따른다.
SELECT
CASE
WHEN 조건1 THEN 반환값1
WHEN 조건2 THEN 반환값2
...
ELSE 기본값
END AS 별칭
FROM 테이블명;
가끔 금융권 코딩테스트에도 나오니 기억해야 한다.
문제 풀이 코드는 다음과 같다. 이것저것 봤는데 이게 제일 간단하다.
SELECT
CAR_ID,
CASE
WHEN SUM(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16') > 0
THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY
CAR_ID
ORDER BY
CAR_ID DESC;
CAR_ID로 그룹화한 후, START_DATE과 END_DATE의 범위 안에 들어와 대여 중인 행(TRUE값)을 SUM한다.
SUM이 0보다 크면 대여중인 행이 있다는 것이므로 CASE WHEN을 이용해 '대여중'으로 출력한다. 이외에는 '대여 가능'으로 출력한다.
처음에 COUNT쓰면 되는건가 생각했는데, COUNT는 null값이 아닌 행의 개수를 세는 것이므로 TRUE 값을 세주지 않아 SUM을 쓰는게 맞다.
COUNT를 쓰려면 CASE WHEN을 중첩하여 사용하면 되긴 하다.
코드는 아래와 같다.
SELECT
CAR_ID,
CASE
WHEN COUNT(
CASE WHEN
START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16'
THEN 1
END
) > 0
THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY
CAR_ID
ORDER BY
CAR_ID DESC;
CASE WHEN을 중첩 사용해서 COUNT를 사용할 수 있다.