🤷♀️ 문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
ℹ️ 테이블
- CAR_RENTAL_COMPANY_RENTAL_HISTORY
HISTORY_ID | INTEGER | FALSE |
CAR_ID | INTEGER | FALSE |
START_DATE | DATE | FALSE |
END_DATE | DATE | FALSE |
✅ 답안
1. MYSQL .ver
SELECT
A.CAR_ID
,CASE
WHEN B.AVAILABILITY_CD = '01' THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM (
SELECT
CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
) A
LEFT JOIN (
SELECT
CAR_ID
,'01' AS AVAILABILITY_CD
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE 1=1
AND TO_DATE('2022-10-16', 'YYYY-MM-DD') BETWEEN START_DATE AND END_DATE
GROUP BY CAR_ID
) B ON (B.CAR_ID = A.CAR_ID)
ORDER BY CAR_ID DESC
2. ORACLE .ver
SELECT
A.CAR_ID
,CASE
WHEN B.AVAILABILITY_CD = '01' THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM (
SELECT
CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
) A
LEFT JOIN (
SELECT
CAR_ID
,'01' AS AVAILABILITY_CD
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE 1=1
AND '2022-10-16' BETWEEN START_DATE AND END_DATE
GROUP BY CAR_ID
) B ON (B.CAR_ID = A.CAR_ID)
ORDER BY CAR_ID DESC
🌟 CHECK POINT
- 나의 로직
1) 2021-10-16일에 대여중인 CAR_ID 목록 구함
2) LEFT JOIN을 이용하여 대여중인 렌탈차 목록과 비교하여 대여중/대여 가능 계산
- 다른 사람의 신박했던 답안1
SUM() 함수를 사용
⇒ 2021-10-16일에 대여중인 CAR_ID는 값이 0보다 커짐. 이를 이용하여 대여중을 구분
--MYSQL
SELECT CAR_ID,
CASE WHEN SUM(IF('2022-10-16' BETWEEN START_DATE AND END_DATE, 1, 0)) = 0 THEN "대여 가능"
ELSE "대여중"
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
-- ORACLE
SELECT CAR_ID, CASE WHEN AP = 0 THEN '대여 가능' ELSE '대여중' END AS AVAILABILITY
FROM (
SELECT
CAR_ID,
SUM(CASE
WHEN TO_DATE('2022-10-16', 'YYYY-MM-DD') BETWEEN START_DATE AND END_DATE THEN 1
ELSE 0
END) AS AP
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
)
ORDER BY CAR_ID DESC;
- 다른 사람의 신박했던 답안2
MAX()함수 사용
⇒ 한글을 비교할 경우 자음<모음<한글로 커짐을 이용. 대여중 > 대여 가능이기 때문에 가능함
SELECT
CAR_ID,
MAX(AVAILABILITY) AS AVAILABILITY
FROM (
SELECT
CAR_ID,
CASE
WHEN START_DATE <= TO_DATE('20221016','YYYYMMDD') AND END_DATE >= TO_DATE('20221016','YYYYMMDD') THEN '대여중'
ELSE '대여 가능'
END AS "AVAILABILITY",
START_DATE,
END_DATE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY)
GROUP BY CAR_ID ORDER BY CAR_ID DESC;
'공부 > CodingTest' 카테고리의 다른 글
[프로그래머스/SQL] 조건에 맞는 사용자와 총 거래금액 조회하기 (0) | 2023.07.19 |
---|---|
[프로그래머스/SQL] 조건에 맞는 사용자 정보 조회하기 (0) | 2023.07.19 |
[프로그래머스/SQL] 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2023.07.18 |
[프로그래머스/SQL] 진료과별 총 예약 횟수 출력하기 (0) | 2023.07.18 |
[프로그래머스/SQL] 자동차 평균 대여 기간 구하기 (0) | 2023.07.17 |