Агрегаты не работают с полным результатом, они работают только с группой в результате.
Рассмотрим таблицу, содержащую:
Person Pet
-------- --------
Amy Cat
Amy Dog
Amy Canary
Dave Dog
Susan Snake
Susan Spider
Если вы используете запрос, который группирует по Person, он разделит данные на следующие группы:
Amy:
Amy Cat
Amy Dog
Amy Canary
Dave:
Dave Dog
Susan:
Susan Snake
Susan Spider
Если вы используете aggreage, например, для подсчета количества, он даст один результат для каждой группы:
Amy:
Amy Cat
Amy Dog
Amy Canary count(*) = 3
Dave:
Dave Dog count(*) = 1
Susan:
Susan Snake
Susan Spider count(*) = 2
Итак, запрос select Person, count(*) from People group by Person
дает вам одну запись для каждой группы:
Amy 3
Dave 1
Susan 2
Если вы попытаетесь получить поле Pet в результате, это не сработает, поскольку в каждой группе может быть несколько значений для этого поля.
(Некоторые базы данных, такие как MySQL, в любом случае позволяют это и просто возвращают любое случайное значение из группы, и вы обязаны знать, является ли результат разумным или нет.)
Если вы используете агрегат, но не указываете какую-либо группировку, запрос все равно будет сгруппирован, и весь результат будет одной группой. Таким образом, запрос select count(*) from Person
создаст одну группу, содержащую все записи, и агрегат может подсчитать записи в этой группе. Результат содержит одну строку из каждой группы, и, поскольку имеется только одна группа, в результате будет одна строка.