Группирование результатов (фраза 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. Наконец, полученные строки результирующей таблицы сортируются в порядке возрастания номера отделения.