Algorithm/Programmars

[SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 - 프로그래머스[Lv.3]

mopipi 2024. 1. 31. 19:03
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/157340

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


/* 대여 시작일 <= 2022-10-16 <= 대여 종료일인 경우 대여 불가능
    -> CAR_ID 로 그룹핑 한 뒤, 대여 시작일 <= 2022-10-16 <= 대여 종료일인 경우만 '대여중'으로 출력
    -> 해당 테이블에 없는 데이터의 경우 '대여 가능'으로 출력
*/
WITH N AS (SELECT CAR_ID, '대여중' AS AB
          FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
          WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE
          GROUP BY CAR_ID)
SELECT DISTINCT Y.CAR_ID, IFNULL(N.AB, '대여 가능') AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY Y
LEFT JOIN N ON Y.CAR_ID = N.CAR_ID
ORDER BY Y.CAR_ID DESC;

풀이

  • 기준일에 대여 기록이 있는 자동차들 ID로만 구성된 테이블 따로 생성 + 대여 여부 따질 열 추가 (디폴트 = 대여중)
  • 기존 테이블과 LEFT JOIN 후 위 테이블에 해당되지 않는 열은 '대여 가능'으로 값 할당)

다른 풀이

  • 추가로 가상의 테이블을 생성하지 않고 IF( 조건, TRUE, FALSE)를 사용해서 지정할 수 있음
  • 기준 기간을 포함하고 있는 데이터면 1, 아닌 경우 NULL 출력
    • 해당 데이터 중 MAX 값이 1인지 아닌지 체크
SELECT CAR_ID, IF(
    MAX(IF('2022-10-16' BETWEEN START_DATE AND END_DATE, 1, NULL)) IS NOT NULL, 
    /* 대여 불가능하면 1, 아니면 NULL => MAX로 1이 없는 차만 NULL을 출력하게 함
       즉, NULL -> 대여 가능, 1 -> 대여중 (대여 불가능한 경우가 하나라도 있으면 불가능하므로)*/
                  '대여중', '대여 가능') AS AVAILABILITY -- NULL이 없는 경우 
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

참고 : https://school.programmers.co.kr/questions/69537

 

 

 

반응형