[프로그래머스 관련문제] : 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
□ 문제요약
위 문제의 조건을 정리하자면 아래와 같다.
- 2022-10-16이 start_date와 end_date 사이에 있으면 → '대여중'
- 해당 날짜에 대여 기록이 없으면 → '대여 가능'
- 차량별로 하나라도 대여중이면 '대여중', 전부 대여 가능이면 '대여 가능'
- car_id로 정렬
여기에서 집중 해야 할 부분은 차량별 하나라도 대여중이면 '대여중'이라고 표시하는 것이다.
이 글에서는 왜 COUNT(AVAILABILITY = '대여중') 이라는 직관적인 로직을 사용하지 않고
SUM 함수를 사용하는지 정리한다.
□ SUM을 이용한 조건 카운팅 근거
SELECT car_id,
IF(SUM(AVAILABILITY = '대여중') > 0, '대여중', '대여 가능') AS AVAILABILITY
FROM states -- 날짜를 구별하여 대여상태를 추출한 CTE
GROUP BY car_id
ORDER BY car_id DESC;
→ 여기에서 핵심은 이 부분이다.
SUM(AVAILABILITY = '대여중')
- AVAILABILITY = '대여중' 은 Boolean 표현식
- MySQL에서는 TRUE → 1, FALSE → 0으로 간주
- 따라서 SUM()을 사용하면 '대여중'인 행의 개수를 셀 수 있다.
□ COUNT로는 안 되나?
결론 부터 말하면 조건식이 불린형이므로 의도와 다르게 동작한다.
select car_id
, sum(AVAILABILITY = '대여중') as sum_대여중
, sum(AVAILABILITY = '대여 가능') as sum_대여가능
, count(AVAILABILITY = '대여 가능') as count_대여가능
from states
group by 1
order by 1 desc;
- COUNT()는 Null 아닌 값만 세는 함수
- AVAILABILITY = '대여중'의 결과는 1 또는 0
- 따라서 0과 1 모두 합산하게 된다.
□ 그럼 언제 SUM을 쓰고 언제 COUNT를 써야 할까?
특정 조건을 만족하는 행의 수를 세고 싶다 | SUM(조건식) |
NULL 제외한 행 개수를 세고 싶다 | COUNT(컬럼) |
전체 행 수가 필요하다 | COUNT(*) |
※ (참고) 전체 코드
with states as (
select car_id
, if('2022-10-16' between start_date and end_date, '대여중', '대여 가능') as AVAILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
)
# 대여 중이 1건이라도 있을 시 대여 가능 여부 상관없이 '대여중'으로 표기
select car_id
, if(sum(AVAILABILITY = '대여중') > 0, '대여중', '대여 가능') as AVAILABILITY
from states
group by 1
order by 1 desc;
'SQL' 카테고리의 다른 글
[MYSQL] SQL의 논리적 실행 순서 예외(GROUP BY, HAVING) (0) | 2025.07.01 |
---|---|
[MYSQL] 날짜를 계산하는 주요 함수 (0) | 2025.07.01 |
[EXIST/ NOT EXIST] 추출된 행 유무 결과가 필요할 때 (1) | 2025.05.22 |
Group by시 그룹화 대상이 아닌 컬럼 가지고 오기 (1) | 2025.05.15 |
CTE 사용법과 재귀함수 (0) | 2025.05.12 |