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


'2022-10-16'이 START_DATE와 END_DATE 사이에 있으면 '대여중' 없으면 '대여 가능'으로 컬럼을 추가하는 조건절을 만들기는 했지만 결과값이 여러개가 나오기 때문에 가장 최근 결과만 가져오기 위해 MAX()를 사용했다.
SELECT
CAR_ID,
MAX(CASE
WHEN START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' THEN '대여중'
ELSE '대여 가능'
END) AS AVAILABILITY
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY
CAR_ID
ORDER BY
CAR_ID DESC;
서브쿼리를 사용하면 GROUP BY가 적용된 CAR_ID 중에서 CASE 조건에 맞는 값을 SELECT 하는 것이기 때문에 CAR_ID가 중복값으로 나오지 않는다.
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.FROM: 가장 먼저 테이블이 지정되어 FROM 절에 정의된 테이블에서 데이터를 가져온다. 이 시점에서 조인(JOIN)이나 서브쿼리가 있으면 먼저 처리된다.
2.ON: 조인이 있을 경우, 테이블 간의 조건을 설정하는 ON 절이 실행된다.
3.WHERE: WHERE 절에서 조건을 걸어, 필터링 한다. 조건이 참인 행만 남는다.
4.GROUP BY: GROUP BY 절에서는 데이터를 그룹화한다. 이 단계에서 집계 함수(SUM, COUNT, AVG 등)가 적용될 수 있다.
5.HAVING: GROUP BY 이후에, HAVING 절에서 그룹화된 데이터를 다시 필터링할 수 있습니다. WHERE와 유사하지만, HAVING은 그룹화된 데이터에 대해 조건을 적용한다.
6.SELECT: 이제 SELECT 절에서 결과를 선택하고, 필요한 열을 추출한다.
7.DISTINCT: 중복 값 제거가 필요하다면 DISTINCT가 적용된다. SELECT 절에서 반환된 결과에서 중복을 제거한다.
8.ORDER BY: ORDER BY 절에 따라 데이터가 오름차순 또는 내림차순으로 정렬된다.
9.LIMIT / OFFSET: 마지막으로 결과의 개수를 제한하거나 시작 위치를 설정할 때 LIMIT 또는 OFFSET이 적용된다.