mysql 문제풀이/hard

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

gooreumsea 2023. 8. 17. 17:09

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

 

습득한 점:

레벨 3문제지만, 코드 길이에 관계없이 지금까지 풀었던 문제중에서 가장 까다로웠고,

깨닫게 된 점이 많았다.

 

문제를 마주하면 이해하기 좋은 코드 작성하고자,

반복적으로 필요하지 않고 해당 함수가 꼭 필요하지 않음에도, With 구문을 습관적으로 활용해서 문제를 풀곤 했었다.

 

덕분에 이해하기는 편했으나, 코드 줄 수가 너무 길어지는 단점이 있었다.

결과적으론... 이해하는 것이 코드를 작성한 나만 쉽지 않을까? 생각들었다.

DA가 sql 코드 성능을 신경 쓸 필요는 별로 없겠지만, 그래도 기존에 해왔던 파이썬이나 자바처럼 좀 더 컴팩트하게 작성하면 좋지 않을까?

 

앞으로는 가독성도 가독성이지만, 최대한 컴팩트하게 작성해보고자 한다.


- IF구문의 새로운 활용법:

* 기본적으로 IF(조건,True값,False값) 의 형태로 작성되지만,
  
IF(컬럼 IN (원하는 서브쿼리),True,False) 의 형태로도 작성될 수 있다.

 

- GROUP BY 특성:

* GROUP BY를 MAX()와 같은 함수와 사용할 때, run을 눌러서 나타나는 테이블은 컬럼들이 MAX()함수로 계산된 컬럼을 제외하고
   다른 컬럼들은 서로 관계성을 지니지 않음.

* 보통 원본 테이블에서 보여지는 그룹 별 첫번째 값들이 보여지게 되어 있음.

 

 

 

문제:

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서

 

2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고,

대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여

자동차 ID와 AVAILABILITY 리스트를 출력하는 쿼리 작성

 

이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시

결과는 자동차 ID를 기준으로 내림차순 정렬

 

 

 

문제파악:

2022-10-16일에 대여가 가능한지의 여부를 찾는 문제

CAR_ID를 고유값으로 뽑아내야 해서 많이 헤맷다.

위 예시에서, CAR_ID의 2,3번째 데이터는 대여시작일과 대여종료일 사이에 10-16가 걸쳐있어서

결과테이블에서는 '대여중'으로 표시되어야 하고 나머지 데이터는 표현되지 않아야 한다.

 

IF구문 내, 서브쿼리를 활용해서,

조건에 해당되는 값이, 서브쿼리로 인해 뽑힌 데이터 내에 단 한개라도 들어있다면, '대여중', 

존재하지 않는다면, '대여 가능'으로 표시되도록 작성 후 alias 를 지정한 뒤, 이를 SELECT절에 CAR_ID 컬럼과 함께 삽입했다.

 

이로써 조건에 맞는 CAR_ID와, 대여 여부를 판단한 AVAILABILITY를 테이블에서 확인할 수 있다.

 

 

 

 

풀이:

SELECT DISTINCT CAR_ID
              , IF(CAR_ID IN(SELECT CAR_ID
                             FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                             WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE),'대여중','대여 가능') AS AVAILABILTIY

FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC