- •Лекция 1. Базы данных в системе экономической информации Основные понятия
- •1.1 Роль и место баз данных в системе экономической информации
- •1.2 Базы данных: основные понятия
- •Лекция 2. Предметная область и ее структура
- •2.1 Предметная область: основные понятия
- •2.2 Исчисление типов отношений между типами объектов
- •2.3 Модель «сущность-связь» и ее разновидности. Основы er моделирования
- •2.4 Структурирование предметной области с позиций функций и задач управления
- •2.5 Матрица отношений между типами объектов
- •Лекция 3. Реляционные базы данных
- •3.1 Отношения реляционных баз данных и свойства
- •3.2 Достоинства и недостатки реляционных баз данных
- •3.3 Элементы реляционной алгебры, реляционного исчисления и трехзначной логики
- •Естественное соединение
- •Правила трехзначной логики
- •Лекция 4. Нормализация таблиц реляционных баз данных
- •4.1 Принципы нормализации
- •4.2 Нормальные формы
- •Лекция 5. Проектирование и создание запросов. Структурированный язык запросов (sql).
- •5.1 Понятие запроса
- •5.2 Соединение таблиц в запросах
- •5.3 Соединение трех и более таблиц
- •5.4 Запрос на выборку
- •5.5 Запрос на выборку с группировкой
- •5.6 Перекрестный запрос
- •5.7 Перекрестный запрос с составным заголовком строк
- •5.8 Запрос на обновление
- •5.9 Запрос на удаление
- •5.10 Запрос на добавление
- •5.11 Логически выраженные команды sql
- •Лекция 6. Microsoft Access как объективно-ориентированная система
- •6.1 Понятие события.
- •6.2 Понятие объектов, их свойств и методов
- •Лекция 7. Современные тенденции развития бд
- •7.2 Основные концепции объектно-ориентированного подхода
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 КодТов
