Группирование результатов (фраза GROUP ВУ)

Приведенные выше примеры сводных данных подобны итоговым строкам, обычно размещаемым в конце отчетов. В итогах все детальные данные отчета сжимаются в одну обобщающую строку. Однако очень часто в отчетах требуется формировать и промежуточные итоги. Для этой цели в операторе SELECT может указываться фраза GROUP BY. Запрос, в котором присутствует фраза GROUP BY, называется группирующим запросом,поскольку в нем группируются данные, полученные в результате выполнения операции SELECT, после чего для каждой отдельной группы создается единственная суммарная строка. Столбцы, перечисленные во фразе GROUP BY, называются группируемыми столбцами.Предложение SELECT может включать только следующие типы элементов:

имена столбцов;

обобщающие функции;

константы;

выражения, включающие комбинации перечисленных выше элементов.

Все имена столбцов, приведенные в списке предложения SELECT, должны присутствовать иво фразе GROUP BY — за исключением случаев, когда имя столбца используется в обобщающей функции. Если совместно с фразой GROUP BY используется предложение WHERE, то оно обрабатывается первым, а группированию подвергаются только те строки, которые удовлетворяют условию поиска.

Стандартом ISO определено, что при проведении группирования все отсутствующие значения рассматриваются как равные. Если две строки таблицы в одном и том же группируемом столбце содержат значения NULL и идентичные значения во всех остальных непустых группируемых столбцах, они помещаются в одну и ту же группу.

Пример 9.16. Использование фразы GROUP BY.

Определить количество персонала, работающего в каждом из отделений компании, а также их суммарную заработную плату.

SELECT KodB, COUNT(KodS) AS C, SUM(ZP) AS SZP FROM S
GROUP BY KodB
ORDER BY KodB;

KodB C SZP
B3
B5
B7

Концептуально, при обработке этого запроса выполняются следующие действия.

1. Строки таблицы S распределяются в группы в соответствии со значениями в столбце номера отделения компании. В пределах каждой из групп, оказываются данные обо всем персонале одного из отделений компании. В нашем примере будут созданы три группы.

KodB KodS ZP
B3 B3 B3 S37 S14 S05
B5 B5 S41 S21
B7 S09

2. Для каждой из групп вычисляется общее количество строк, равное количеству работников в отделении, а также сумма значений в столбце ZP. Затем генерируется единственная сводная строка для всейгруппы исходных строк.

3. Наконец, полученные строки результирующей таблицы сортируются в порядке возрастания номера отделения.