250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

데이터 놀이터

GROUP BY -  자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 본문

SQL

GROUP BY -  자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

jjjk84 2023. 8. 15. 18:21
728x90

1. 문제

 

2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여

자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요.

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

결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

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

 

2. 문제 조건

 

  1. 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시, 그 외에는 '대여 가능'을 표시하는 컬럼 추가(반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시) -> CASE, subquery를 통해 2022-10-16일이 대여 시작일과 대여 종료일 사이에 있는 car_id의 경우에는 '대여중', 그 외 '대여 가능' 표시/ GROUP BY ID도 필요
  2. 해당 자동차 ID, AVAILABILITY 리스트 출력 -> SELECT
  3. 자동차 ID 기준 내림차순 정렬 -> ORDER BY

 

3. 코드 작성

 

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;

# 처음 푼 풀이
# SELECT CAR_ID
#      , CASE
#         WHEN SUM(TEMP.AVAIL) = 1 THEN '대여중'
#         ELSE '대여 가능'
#        END AS AVAILABILITY
# FROM (SELECT CAR_ID
#            , CASE 
#                 WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN 1
#                 ELSE 0
#              END AS AVAIL
#       FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY) AS TEMP
# GROUP BY CAR_ID
# ORDER BY CAR_ID DESC;

 

 

4.  회고

 

  • subquery 사용이 미숙했던 것 같다. 처음 푼 풀이에서는 1과 0으로 대여 여부를 판별하는 과정을 거쳤는데, 이후 푼 풀이보다 훨씬 복잡했다. CASE WHEN 조건문에도 subquery를 사용할 수 있다.
  • FROM에 subquery를 통해 테이블을 가져온다면, 테이블 명을 꼭 붙여줘야한다.
  • 문제에 ~별, 이라는 조건이 없어도 GROUP BY를 할 상황인지 잘 판단해야겠다.
728x90