상세 컨텐츠

본문 제목

sql 쿼리에서 count(if(~)), if(count(~)) 순서 차이

IT/DB

by JR 2026. 4. 15. 11:06

본문

300x250

 

핵심 원칙 한 가지만 기억하면 돼요!

"조건을 먼저 걸고 싶으면 → 집계함수가 바깥"


🔢 집계함수가 바깥 (자주 쓰는 패턴)

먼저 조건으로 걸러내고 → 그 결과를 집계

-- IF 버전
COUNT( IF(조건, 1, NULL) )
SUM(   IF(조건, 값, 0)   )

-- CASE 버전
COUNT( CASE WHEN 조건 THEN 1 END )
SUM(   CASE WHEN 조건 THEN 값 ELSE 0 END )

🔢 집계함수가 안쪽 (거의 안 쓰는 패턴)

먼저 집계하고 → 그 집계 결과에 조건 적용

-- 집계한 결과값 자체에 조건을 걸 때
IF( COUNT(컬럼) > 0, '있음', '없음' )
IF( SUM(금액)  > 0, '흑자', '적자' )

이건 SELECT보다는 주로 HAVING절이나 다른 함수 안에서 쓰여요.


📌 한눈에 비교

패턴 의미 사용빈도
COUNT(IF(조건, 1, NULL)) 조건에 맞는 row만 카운트 ⭐⭐⭐ 자주
SUM(IF(조건, 값, 0)) 조건에 맞는 값만 합산 ⭐⭐⭐ 자주
SUM(CASE WHEN 조건 THEN 값 END) 조건에 맞는 값만 합산 ⭐⭐⭐ 자주
IF(COUNT(컬럼) > 0, A, B) 집계 결과에 따라 분기 ⭐ 드물게

🧠 헷갈릴 때 기억법

"몇 개야?" → COUNT가 밖  →  COUNT( IF(조건, 1, NULL) )
"얼마야?"  → SUM이 밖    →  SUM( IF(조건, 값, 0) )
"결과가 있어?"→ IF가 밖  →  IF( COUNT(컬럼) > 0, ... )

 

"무엇을 최종적으로 구하냐" 가 바깥에 오는 함수예요! 😊

 

 

<참고>

CUBRID에서 COUNT(IF(...)) 사용 가능 여부

 

결론: 쓸 수 있어요!

SELECT
    COUNT(IF(status = 'Y', 1, NULL)) AS active_count
FROM orders;

⚠️ 핵심 포인트: ELSE 값을 0이 아닌 NULL 로 줘야 해요!


❌ 이렇게 쓰면 안 돼요

-- ELSE 0 이면 조건 불일치도 전부 카운트됨!
COUNT(IF(status = 'Y', 1, 0))  -- ❌ 잘못된 사용

✅ 이렇게 써야 해요

-- ELSE NULL 이면 COUNT가 NULL을 무시함
COUNT(IF(status = 'Y', 1, NULL))  -- ✅ 올바른 사용

이유

COUNT는 NULL을 카운트하지 않는 특성이 있어서, 조건 불일치 시 NULL을 반환해야 해당 행이 카운트에서 제외돼요.

ELSE 값 동작
ELSE 0 0도 카운트되어 전체 행 수가 나옴 ❌
ELSE NULL NULL은 무시되어 조건 일치만 카운트됨 ✅

 

 

300x250

관련글 더보기