SELECT c.grade_cd,
COUNT(*) AS order_cnt,
SUM(o.amount) AS total_amount
FROM orders o
JOIN customer c ON c.customer_id = o.customer_id
WHERE o.status_cd = 'DONE' -- 접기 전에 행을 거릅니다
GROUP BY c.grade_cd
HAVING SUM(o.amount) > 10000000 -- 접은 뒤 그룹을 거릅니다
ORDER BY total_amount DESC;WHERE는 집계 전, HAVING은 집계 후입니다. 개별 행 조건을 HAVING에 쓰면 불필요하게 많은 행을 집계한 뒤 버리게 되어 느려집니다. 걸러낼 수 있는 것은 최대한 WHERE에서 거릅니다.