Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по базам данных 2005.docx
Скачиваний:
146
Добавлен:
29.10.2018
Размер:
148.31 Кб
Скачать

5.5 Запрос на выборку с группировкой

Команда Group by языка SQL позволяет разбить все записи на группы и для каждой группы записей сформировать одну запись. Таким образом, итоговая таблица будет состоять из сгруппированных записей. Группировка может быть выполнена по одному или нескольким полям. Поскольку таблица, полученная в результате выполнения запроса, будет состоять из сгруппированных записей, для каждого поля, входящего в запрос по которому группировка не выполняется, необходимо указать выражение, которое вычисляется на множестве значений данного поля в группе. В качестве таких выражений используются агрегатные функции.

Функция Sum() возвращает значение суммы для группы записей.

Функция Avg() используется для нахождения среднего значения для записей, входящих в группу.

Функция Count() используется для нахождения количества записей в группе.

Функция Min() используется для нахождения минимального значения.

Функция Max()используется для нахождения максимального значения.

Функции First() и Last() возвращают соответственно значение поля из первой и последней записи группы.

Помимо агрегатных функций в запрос на выборку с группировкой могут быть включены поля, представляющие собой условия, используемые для проверки: будет ли включена данная запись в группу или нет.

Приведем пример запроса на выборку с группировкой. Требуется определить сумму поставок по каждому поставщику и по каждому виду продукции за определенный год. В данном случае сгруппировать записи нужно по двум полям: КодПост и КодТов. Из всех записей будет необходимо выбрать только те, которые относятся к 2003 году:

Where Year (Поставка.ДатаПост)=2003.

Для расчета суммы будет использоваться агрегатная функция Sum():

Sum(Цена*КолТов) as СумПост.

В синтаксической конструкции запроса на выборку с группировкой агрегатные функции выступают в качестве вычисляемых полей. Для определения их имени используется команда As.

С учетом приведенных пояснений можно записать текст запроса:

Select Поставка.КодПост, First(НаимПост) as [Наименование поставщика],

Товар.КодТов, First(НаимТов) as [Наименование товара],

Sum(Цена*КолТов) as СумПост

From Поставщик Inner Join (Поставка Inner Join Товар on

Поставка.КодТов = Товар.КодТов) on

Поставщик.КодПост = Поставка.КодПост

Where Year (Поставка.ДатаПост)=2003

Group by Поставщик.КодПост, Товар.КодТов

В списке полей команды Select для некоторых полей используются агрегатные функции, для других – нет. Агрегатные функции могут не использоваться только для тех полей, по которым выполняется группировка. В данном примере это поля КодПост и КодТов.

5.6 Перекрестный запрос

Перекрестный запрос является разновидностью запроса на выборку с группировкой. Этот запрос удобен для представления данных в матричной форме. В виртуальной таблице, имеющей матричную форму, данные одновременно группируются по строкам и столбцам. В качестве заголовков столбцов или строк используются поля, которые являются ключевыми в одной из таблиц базы данных или поля, связанные с ключевыми как 1:1. Любой запрос на выборку с группировкой путем выполнения определенных преобразований может быть трансформирован в перекрестный.

Приведем пример, когда может возникнуть необходимость преобразовать запрос на выборку с группировкой в перекрестный запрос, для рассматриваемой базы данных. В качестве заголовков строк могут использоваться коды поставщиков, а в качестве заголовков столбцов – коды товаров, а на пересечении строк и столбцов – суммы поставок от данного поставщика по данному товару.

В любом перекрестном запросе логически можно выделить:

поле или поля, образующие заголовки строк;

поле, используемое в качестве заголовков столбцов;

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

Как правило, перекрестный запрос составляется на основе данных из нескольких таблиц.

В схематическом виде запрос на выборку с группировкой можно представить в следуем виде:

Select КодПост, КодТов, Sum(КолТов*Цена) as СумПост

From < связка таблиц >

Where <условие отбора записей>

Group by КодПост, КодТов

Преобразование запроса на выборку с группировкой в перекрестный запрос производится в три этапа:

В запрос включаются две дополнительные команды Transform и Pivot. Команда Transform используется для обозначения того, что запрос будет являться перекрестным, а команда Pivot используется для группировки по столбцам.

Список полей запроса на выборку с группировкой обязательно содержит одно вычисляемое поле, использующее агрегатную функцию. Поле с агрегатной функцией исключается из предложения Select и включается в предложение Transform.

Далее определяется, какое поле будет соответствовать заголовкам строк, а какое - заголовкам столбцов. При определении того, какое поле будет являться заголовками столбцов, проверяются два условия:

входит ли поле в предложение Select,

входит ли поле в состав полей с группировкой.

Поле, удовлетворяющее этим условиям, исключается из предложений Select и Group by и переносится в предложение Pivot.

Преобразуем запрос на выборку с группировкой в перекрестный запрос:

Transform Sum (КолТов*Цена) as СумПост

Select КодПост

From < связка таблиц >

Where <условие отбора записей>

Group by КодПост

Pivot КодТов