ПРЕДЛОЖЕНИЕ GROUP BY
Предложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминах другого поля,
и применять функцию агрегата к подмножеству. Это дает вам возможность объединять поля и агрегатные функции
в едином предложении SELECT. Например, предположим что вы хотите найти наибольшую сумму приобретений
полученную каждым продавцом. Вы можете сделать раздельный запрос для каждого из них, выбрав MAX (amt) из
таблицы Порядков для каждого значения поля snum. GROUP BY, однако, позволит Вам поместить их все в одну
команду:
SELECT snum, MAX (amt) FROM Orders GROUP BY snum;
Вывод для этого запроса показывается в Рисунке 6.5.
snum |
|
1001 |
767.19 |
1002 |
1713.23 |
1003 |
75.75 |
1014 |
1309.95 |
1007 |
1098.16 |
Рисунок 6.5:Нахождение максимальной суммы продажи у каждого продавца
GROUP BY применяет агрегатные функции независимо от серий групп которые определяются с помощью значения
поля в целом. В этом случае, каждая группа состоит из всех строк с тем же самым значением поля snum, и
MAX функция применяется отдельно для каждой такой группы. Это значение поля, к которому применяется GROUP
BY, имеет, по определению, только одно значение на группу вывода, также как это делает агрегатная функция.
Результатом является совместимость которая позволяет агрегатам и полям объединяться таким образом.
Вы можете также использовать GROUP BY с многочислеными полями. Совершенствуя вышеупомянутый пример далее,
предположим что вы хотите увидеть наибольшую сумму приобретений получаемую каждым продавцом каждый день.
Чтобы сделать это, вы должны сгруппировать таблицу Порядков по датам продавцов, и применить функцию MAX
к каждой такой группе, подобно этому:
SELECT snum, odate, MAX ((amt)) FROM Orders GROUP BY snum, odate;
Вывод для этого запроса показывается в Рисунке 6.6.
snum |
odate |
|
1001 |
10/03/1990 |
767.19 |
1001 |
10/05/1990 |
4723.00 |
1001 |
10/06/1990 |
9891.88 |
1002 |
10/03/1990 |
5160.45 |
1002 |
10/04/1990 |
75.75 |
1002 |
10/06/1990 |
1309.95 |
1003 |
10/04/1990 |
1713.23 |
1014 |
10/03/1990 |
1900.10 |
1007 |
10/03/1990 |
1098.16 |
Рисунок 6.6: Нахождение наибольшей суммы приобретений на каждый день
Конечно же, пустые группы, в дни когда текущий продавец не имел порядков, не будут показаны в выводе.