해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 CASE와 집계함수를 이용하여 푸는 문제로 문제만 이해한다면 간단히 풀 수 있는 문제일 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
해당 문제는 살짝 문제가 꼬아서 낸 것 같습니다. 각각의 CAR_ID에는 다양한 대여 시작 날짜와 대여 종료 날짜가 존재 합니다.
여기서 각각의 CAR_ID에서 2022년 10월 16일에 이미 대여한 기록이 있으면 "대여중"으로 표시하고 없다면 "대여 가능"이라고 표시하면 됩니다. 그리고 대여 종료일이 2022년 10월 16일이어도 "대여중"으로 표시해주면 됩니다.
즉, 해당 표시는 CASE WHEN을 이용해서 풀면 간단히 풀릴 것 같습니다.
1. GROUP BY를 통해 데이터 확인하기
SELECT *
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
CAR_ID 각각 데이터가 묶인 것을 확인했습니다.
2. 2022년 10월 16일에 데이터 뽑아내기
우선 해당 문제를 풀기 전에 짚고 갈 것이 있습니다.
SELECT절에서 집계함수 MAX()안에 연산자를 넣게 되면 해당 연산이 참값이라면 1을 출력하고 거짓이라면 0을 출력합니다. (저희는 이 방법을 이용하게 답을 얻을 것입니다.)
SELECT CAR_ID
, MAX('2022-10-16' BETWEEN START_DATE AND END_DATE)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
위의 이미지와 같이 2022년 10월 16일에 대여 중인 CAR_ID는 1로 출력되고 대여 가능인 값은 0으로 출력 됩니다.
이제 CASE 문을 활용하여 "대여중", "대여 가능" 문으로 출력 해보겠습니다.
3. CASE 문 활용하기
SELECT CAR_ID
, CASE
WHEN MAX('2022-10-16' BETWEEN START_DATE AND END_DATE) = 1 THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
이렇게 CASE 문을 활용하여 만약 쿼리 MAX('2022-10-16' BETWEEN START_DATE AND END_DATE)의 값이 2번에서 언급했던 것처럼 1값이 나오면 "대여중"으로 출력해주기 위해 "= 1"을 조건으로 넣어주게 되어 해당 CASE문에서 참 값이 나오도록 만들어 주었습니다.
이렇게 CASE문의 조건을 잘 맞춰주면 해당 문제는 정답이 됩니다!!
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기(저자 별 카테고리 별 매출액 집계하기) (0) | 2024.10.31 |
---|---|
[SQL] Programmers 문제 풀기(즐겨찾기가 가장 많은 식당 정보 출력하기) (0) | 2024.10.30 |
[SQL] Programmers 문제 풀기 (대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기) (0) | 2024.10.29 |
[SQL] Programmers 문제 풀기 (물고기 종류 별 대어 찾기) (0) | 2024.10.28 |
[SQL] Programmers 문제 풀기 (연도별 대장균 크기의 편차 구하기) (0) | 2024.10.25 |