https://school.programmers.co.kr/learn/courses/30/lessons/157340
/* 대여 시작일 <= 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
'Algorithm > Programmars' 카테고리의 다른 글
[JAVA] 하노이의 탑 - 프로그래머스[Lv.1] (1) | 2024.02.08 |
---|---|
[JAVA] 124 나라의 숫자 - 프로그래머스[Lv.2] (0) | 2024.02.06 |
[SQL] 입양 시각 구하기(2) - 프로그래머스[Lv.4] (1) | 2024.01.29 |
[SQL] 저자 별 카테고리 별 매출액 집계하기 - 프로그래머스[Lv.4] (0) | 2024.01.28 |
[SQL] 조건에 맞는 사용자와 총 거래금액 조회하기 - 프로그래머스[Lv.3] (0) | 2024.01.27 |