꿈은 데이터분석가, 취미는 계획

[MY SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 본문

SQL/sql문풀

[MY SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

data_2080 2024. 7. 26. 08:25
728x90

출처:[프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] :  자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/157340
문제(일부): 특정일에 대여 중인 자동차의 경우 '대여중' 이라고 표시, 아닌 경우 '대여가능'을 표시하는 컬럼 추가


1. WITH절과 CASE 활용하기

1) WITH절에서 CASE WHEN으로 대여기간이 '2022-10-16'에 있는 경우 1, 아닌 경우 0인 AVAILABILITY컬럼 생성
2) 메인쿼리에서 1번의 컬럼의 합에 대해 1이면 '대여중' 0이면 '대여 가능'으로 표시

WITH RENTAL AS(
SELECT CAR_ID, 
    CASE
        WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN 1
        ELSE 0
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
)

SELECT CAR_ID, 
    CASE SUM(AVAILABILITY)
        WHEN 1 THEN '대여중'
        WHEN 0 THEN '대여 가능'
    END AS AVAILABILITY
FROM RENTAL
GROUP BY CAR_ID
ORDER BY CAR_ID DESC

 

2. 서브쿼리와 CASE 활용하기

1) CASE구문에서 '2022-10-16'에 대여중인 CAR_ID를 찾는 서브쿼리를 생성,
    CAR_ID가 서브쿼리의 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

3. WITH절과 JOIN활용하기

1) '2022-10-16'에 대여중인 CAR_ID를 추출한 WITH절 생성

2) WITH절과 원본df의 CAR_ID를 RIGH JOIN
3) CAR_ID에 NULL이 있다면 대여가능, 그렇지 않으면 대여중

WITH RENTALED AS(
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE
)

SELECT H.CAR_ID,
    IF(ISNULL(R.CAR_ID), '대여 가능', '대여중') AS AVAILABILITY
FROM RENTALED AS R 
    RIGHT JOIN(
        SELECT CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY  
    )AS H ON
    R.CAR_ID = H.CAR_ID
GROUP BY H.CAR_ID
ORDER BY H.CAR_ID DESC
728x90