# Aggregations

As we saw in the **Math** section, SQL provides many ways to calculate aggregate measures and statistics. We can use a mathematical function like `SUM()`

to sum a list of a values, or `AVG()`

to calculate the average of a list of values.

Sometimes, however, it’s useful to run that aggregation/calculation multiple times, for *each separate group in our data*.

For example, take a look at the following table `calls`

, which contains call records for a telemarketing company:

```
```

We *could* use a a mathematical function like `COUNT`

to count the number of calls in the table, giving us an overall/total number of calls:

```
SELECT COUNT(*)
FROM calls
# Result
#
```

But what if we want to do something a bit more nuanced, like counting the number of calls on *each separate day*, or counting the number of calls made by *each separate agent*? Rather than generating a single number/count using `COUNT`

, we’d need to produce tables like this:

Luckily, SQL provides a handy operator - `GROUP BY`

- which lets us do exactly that. In this chapter, we’ll find out how.