"조건을 먼저 걸고 싶으면 → 집계함수가 바깥"
먼저 조건으로 걸러내고 → 그 결과를 집계
-- 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, ... )
"무엇을 최종적으로 구하냐" 가 바깥에 오는 함수예요! 😊
결론: 쓸 수 있어요! ✅
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은 무시되어 조건 일치만 카운트됨 ✅ |

| RANK() OVER (ORDER BY.... ) 순위 랭크함수 사용 방법은? (0) | 2026.06.02 |
|---|---|
| SQL 큐브리드 테이블 간 차집합 difference 위,아래 순서 차이 (0) | 2026.01.16 |
| 큐브리드 ini 설정파일 수정, 데이터 추출 성능 개선하기 (0) | 2026.01.14 |
| mysql 조건에서 in 절에는 몇 개까지 넣을 수 있을까? (1) | 2026.01.14 |
| SUM(DECODE(SIGN(point), 1, 1, 0)) 해당 쿼리 뜻은? (0) | 2026.01.14 |