SQL

GROUP BY 후 조건 개수 세기: SUM() vs COUNT() 어떤 걸 써야 할까?

silver-w 2025. 7. 3. 16:49

[프로그래머스 관련문제]  : 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

 

프로그래머스

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로 컬럼 추출 시 대여중과 대여가능 조건 모두 카운트 되는 걸 알 수 있다.

  • 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;