📍 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📍 풀이
[ 답안 1 ] - CASE문 사용
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 'AVAILABILITY'
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
CASE문을 사용해 각 CAR_ID에 대해 '2022-10-16'이라는 날짜가 START_DATE와 END_DATE 사이에 있는지 확인한다.
있다면 '대여중' 을 반환하고, 없으면 '대여 가능'을 반환하도록 하였다.
이때, 결과는 'AVALIABILITY' 라는 별칭으로 표시된다.
[ 답안 2 ] - IF문 사용
❌ 내가 쓴 틀린 코드 ❌
SELECT CAR_ID, IF('2022-10-16' BETWEEN START_DATE AND END_DATE, '대여중', '대여 가능') AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
⭕ 정답 코드 ⭕
SELECT CAR_ID, MAX(IF('2022-10-16' BETWEEN START_DATE AND END_DATE, '대여중', '대여 가능')) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
첫번째 코드는 왜 틀릴까?
GROUP BY를 사용해서 각 CAR_ID별로 그룹화하고, 동시에 각 그룹 내에서 어떤 값이 '대여중'인지 '대여 가능'인지를 결정해야 한다.
GROUP BY가 적용된 후에는 각 그룹에 대한 단일 값만 반환할 수 있다.
따라서 SQL의 집계 함수인 MAX, MIN, AVG, SUM 등을 사용해야 한다.
(이런 집계 함수 없이는 GROUP BY를 사용 후 그룹화된 각 행에서 하나의 결과를 얻을 수 없다.)
애초에 ❌ 저 틀린 코드 ❌ 는 문법적으로 틀린 SQL 구문이다 !! 하지만, 프로그래머스 상에서는 틀렸다고 뜨지만 오류를 뱉지는 않는다. 이 부분 관련해서 읽어보면 아주 좋을 만한 글이다 => https://school.programmers.co.kr/questions/38703
그렇다면 집계 함수 중 왜 MAX 함수를 써야 하는 것일까?
MAX를 쓰게 되면 각 CAR_ID 그룹에서 '대여중' 과 '대여 가능' 중 사전 순으로 뒤에 오는 값을 선택한다.
이때, '대여중'이 '대여 가능' 보다 사전 순으로 뒤에 오기 때문에
해당 날짜에 차량이 한 번이라도 대여되었다면 '대여중'이 선택된다.
=> 즉, 특정 날짜에 자동차를 대여할 수 있는지 여부를 파악하기 위해 MAX가 사용되는 것이다.
'SQL' 카테고리의 다른 글
[SQL] (프로그래머스/MySQL/Level 2)_ 조건에 부합하는 중고거래 상태 조회하기 (0) | 2024.02.04 |
---|---|
[SQL] (프로그래머스/MySQL/Level 3)_대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.01.28 |
[SQL] (프로그래머스/MySQL/Level 3)_즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.01.26 |
[SQL] (프로그래머스/MySQL/Level 4)_오프라인/온라인 판매 데이터 통합하기 (0) | 2024.01.22 |
[SQL] LIKE() 함수 : 특정 문자 포함해서 검색 (MYSQL) (0) | 2024.01.17 |