데이터 놀이터
GROUP BY - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 본문
728x90
1. 문제
2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여
자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요.
이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고
결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/157340
2. 문제 조건
- 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시, 그 외에는 '대여 가능'을 표시하는 컬럼 추가(반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시) -> CASE, subquery를 통해 2022-10-16일이 대여 시작일과 대여 종료일 사이에 있는 car_id의 경우에는 '대여중', 그 외 '대여 가능' 표시/ GROUP BY ID도 필요
- 해당 자동차 ID, AVAILABILITY 리스트 출력 -> SELECT
- 자동차 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
'SQL' 카테고리의 다른 글
JOIN - 없어진 기록 찾기 (0) | 2023.08.18 |
---|---|
SELECT - 12세 이하인 여자 환자 목록 출력하기 (0) | 2023.08.17 |
GROUP BY - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2023.08.15 |
GROUP BY - 카테고리 별 도서 판매량 집계하기 (0) | 2023.08.15 |
SQL 중급 강의 정리 (0) | 2023.08.15 |