'결제 완료 주문이 두 건 이상인 고객'을 찾으려다 WHERE COUNT(*) >= 2를 썼더니 오류가 난다. WHERE가 조건을 거는 자리인데 왜 안 될까? 한 행을 고르는 조건과 행을 묶은 뒤 그 묶음을 고르는 조건은 서로 다른 자리에 놓아야 하기 때문이다.
WHERE에 COUNT 집계 조건을 쓰면 왜 오류가 날까?
아래 주문 여덟 건에서 Ana의 결제 완료 주문은 두 건, Ben과 Cora는 각각 한 건이다. 취소 주문도 섞여 있어 전체 주문 수와 결제 완료 주문 수가 다르다.
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer TEXT NOT NULL,
status TEXT NOT NULL
);
INSERT INTO orders (order_id, customer, status) VALUES
(1, 'Ana', 'paid'), (2, 'Ana', 'paid'), (3, 'Ana', 'cancelled'),
(4, 'Ben', 'paid'), (5, 'Ben', 'cancelled'),
(6, 'Cora', 'paid'), (7, 'Cora', 'cancelled'), (8, 'Cora', 'cancelled');SELECT customer, COUNT(*)
FROM orders
WHERE COUNT(*) >= 2
GROUP BY customer;이렇게 WHERE에 집계 조건을 넣으면 SQLite는 misuse of aggregate: COUNT() 오류를 낸다. WHERE는 각 주문 행을 검사할 때 적용되고, COUNT(*)는 행들을 묶어야 계산할 수 있다. 아직 묶지도 않았는데 묶음의 크기를 물은 셈이다.
WHERE는 어떤 주문을 집계할지 먼저 고른다
결제 완료 주문만 세려면 그룹을 만들기 전에 status = 'paid'를 적용한다.
SELECT customer, COUNT(*) AS paid_count
FROM orders
WHERE status = 'paid'
GROUP BY customer
ORDER BY customer;customer paid_count
Ana 2
Ben 1
Cora 1여덟 행 중 결제 완료 네 행이 남고, 고객별로 묶이면 2·1·1이 된다. 이때 COUNT(*)는 남은 행을 센다. 원래 주문 여덟 건을 세는 것이 아니다.
HAVING은 어떤 고객 그룹을 남길까?
이제 고객별 결제 건수가 두 건 이상인 그룹만 남기자. 이 조건은 GROUP BY 뒤의 HAVING에 쓴다.
도식의 중간 결과에서 WHERE는 행을 줄이고 HAVING은 이미 만들어진 그룹을 줄인다. 같은 조건을 SQL로 작성해 Ana 그룹만 남는지 확인하자.
SELECT customer, COUNT(*) AS paid_count
FROM orders
WHERE status = 'paid'
GROUP BY customer
HAVING COUNT(*) >= 2
ORDER BY customer;customer paid_count
Ana 2WHERE는 주문 행을, HAVING은 고객 그룹을 거른다. 이름이 비슷한 필터 두 개가 같은 일을 두 번 하는 것은 아니다.
WHERE를 빼면 왜 결과가 늘어날까?
WHERE status = 'paid'를 빼고 HAVING COUNT(*) >= 2만 남기면 Ana 3건, Ben 2건, Cora 3건이 모두 조건을 통과한다. 취소 주문까지 센 결과다. 쿼리가 실행된다고 해서 질문에 맞는 답을 준다는 뜻은 아니다.
집계 결과가 이상하면 순서를 거꾸로 점검해 보자. '두 건 이상'이라는 그룹 조건보다 먼저, 어떤 상태의 주문을 셀지 확인한다. 상태값이 더 늘어나는 서비스라면 paid의 정의도 명시해야 한다. 예를 들어 환불된 주문을 결제 완료로 볼지는 SQL 문법이 아니라 데이터와 업무 규칙의 문제다.
핵심 요약
결제 완료 주문이 두 건 이상인 고객을 찾으려면 WHERE status = 'paid'로 대상 행을 고르고, GROUP BY customer로 묶은 뒤, HAVING COUNT(*) >= 2로 그룹을 고른다. COUNT(*)를 WHERE에 넣을 수 없고, WHERE를 빼면 취소 건까지 집계될 수 있다. 집계 쿼리는 '무엇을 셀까?'와 '몇 건 이상 남길까?'를 나눠 읽으면 덜 헷갈린다.

