An aggregate turns several rows into one result. GROUP BY chooses the grain: one row per region, status or customer. Before writing a sum, say that grain out loud. Adding a source identifier to GROUP BY changes the question because it creates smaller groups.
COUNT(*) counts records, COUNT(amount) counts known amounts and COUNT(DISTINCT customer_id) counts known customer identifiers once. SUM and AVG ignore NULL inputs, so an average uses the number of known amounts as its denominator. HAVING filters groups after aggregation. WHERE filters source records first. Aster Supply's reporting lead needs both valid totals and the count of records behind them; a total alone can hide missing values. Keep NULL regions visible unless the task explicitly excludes them, because they are evidence of an incomplete source feed.