Разработка базы данных "Видеопрокат" и приложения, позволяющие выполнять обработку данных фирмы, страница 5

GROUP BY ДИСК.КодДиска, ФИЛЬМ.Название, ФИЛЬМ.Год, ФИЛЬМ.Жанр, ФИЛЬМ.Режиссер, ФИЛЬМ.Продолжительность, ДИСК.Звук, ДИСК.Наличие

HAVING (((ДИСК.Наличие)=True) AND ((Last(ПРОКАТ.ДатаЗакрытия)) Is Not Null));

Объединяющий запрос:

SELECT [_Диски_в_наличии_которые_ни_разу_не_выдавлись].КодДиска, [_Диски_в_наличии_которые_ни_разу_не_выдавлись].Название, [_Диски_в_наличии_которые_ни_разу_не_выдавлись].Год, [_Диски_в_наличии_которые_ни_разу_не_выдавлись].Жанр, [_Диски_в_наличии_которые_ни_разу_не_выдавлись].Режиссер, [_Диски_в_наличии_которые_ни_разу_не_выдавлись].Продолжительность, [_Диски_в_наличии_которые_ни_разу_не_выдавлись].Звук

FROM _Диски_в_наличии_которые_ни_разу_не_выдавлись

UNION SELECT [_Возврвщеные_диски].КодДиска, [_Возврвщеные_диски].Название, [_Возврвщеные_диски].Год, [_Возврвщеные_диски].Жанр, [_Возврвщеные_диски].Режиссер, [_Возврвщеные_диски].Продолжительность, [_Возврвщеные_диски].Звук

FROM _Возврвщеные_диски;

Результат:

Запрос 2.

Сформировать список дисков находящихся «на руках» клиентов.

Этот запрос должен список дисков, с указанием данных о записанных на них фильмах, которые в наличии и у которых дата закрытия в табличке отсутствует. Желательно также указать паспортные данные клиента, за которым числиться диск.

Текст запроса:

SELECT ДИСК.КодДиска, ФИЛЬМ.Название, ФИЛЬМ.Год, ФИЛЬМ.Жанр, ФИЛЬМ.Режиссер, ФИЛЬМ.Продолжительность, ДИСК.Звук, ДИСК.Наличие, ПРОКАТ.ДатаОткрытия, ПРОКАТ.ДатаЗакрытия, ПРОКАТ.Паспорт

FROM ФИЛЬМ INNER JOIN (ДИСК INNER JOIN ПРОКАТ ON (ДИСК.КодДиска = ПРОКАТ.КодДиска) AND (ДИСК.КодДиска = ПРОКАТ.КодДиска)) ON ФИЛЬМ.КодФильма = ДИСК.КодФильма

WHERE (((ДИСК.Наличие)=True) AND ((ПРОКАТ.ДатаЗакрытия) Is Null));

Результат:

Запрос 3.[A1] 

Определить рейтинг фильмов по количеству выдач за все время:

Этот запрос должен вернуть список всех фильмов, в порядке, начиная с тех, который больше всего раз выдавались и указать количество выдач для каждого диска.

Текст запроса:

SELECT Count(ФИЛЬМ.РейтингКинопоиск) AS [Count-РейтингКинопоиск], ДИСК.КодДиска, ФИЛЬМ.Название, ФИЛЬМ.Жанр, ФИЛЬМ.Год, ФИЛЬМ.Режиссер, ФИЛЬМ.РейтингКинопоиск

FROM (ФИЛЬМ INNER JOIN ДИСК ON (ФИЛЬМ.КодФильма = ДИСК.КодФильма) AND (ФИЛЬМ.КодФильма = ДИСК.КодФильма)) INNER JOIN ПРОКАТ ON (ДИСК.КодДиска = ПРОКАТ.КодДиска) AND (ДИСК.КодДиска = ПРОКАТ.КодДиска)

GROUP BY ДИСК.КодДиска, ФИЛЬМ.Название, ФИЛЬМ.Жанр, ФИЛЬМ.Год, ФИЛЬМ.Режиссер, ФИЛЬМ.РейтингКинопоиск

ORDER BY Count(ФИЛЬМ.РейтингКинопоиск) DESC;

Результат:

Запрос 4.

Вывести список, должников по каждому диску:

Результатом данного запроса должен стать список, содержащий перечень дисков, по которым уже появилась задолженность, с отображением клиента, просрочившего диск, просроченного количества дней, и суммы к оплате.

Текст запроса:

SELECT ПРОКАТ.КодДиска, ПРОКАТ.Паспорт, ПРОКАТ.ДатаОткрытия, ПРОКАТ.ДатаЗакрытия, Date()-[ДатаОткрытия]-1 AS Просрочено_дней, [СТОИМОСТЬ.Стоимость]*(Date()-[ДатаОткрытия]-1) AS [К оплате]

FROM СТОИМОСТЬ INNER JOIN ПРОКАТ ON (СТОИМОСТЬ.КодСтоимости = ПРОКАТ.КодСтоимости) AND (СТОИМОСТЬ.КодСтоимости = ПРОКАТ.КодСтоимости)

WHERE (((ПРОКАТ.ДатаЗакрытия) Is Null) AND ((Date()-[ДатаОткрытия]-1)>0));

Результат:

Запрос 5.[A2] 

На какую сумму поставил дисков каждый поставщик:

Данный запрос должен выдать список поставщиков с итоговой суммой по всем купленным у них дискам.

SELECT ПОСТАВЩИК.Имя, Sum(ПОКУПКА.Стоимость) AS [Sum-Стоимость]

FROM ПОСТАВЩИК INNER JOIN ПОКУПКА ON (ПОСТАВЩИК.КодПоставщика = ПОКУПКА.КодПоставщика) AND (ПОСТАВЩИК.КодПоставщика = ПОКУПКА.КодПоставщика)

GROUP BY ПОСТАВЩИК.Имя;

Результат:

Архивирование данных из таблицы прокат.

Архивирование выполняется в три этапа. На первом этапе в таблицу Архив_ПРОКАТ добавляются записи из таблицы ПРОКАТ, в которых значение в поле дата закрытия не пустое (Is Not Null), т.е. те все записи, кроме тех в которых фигурируют не сданные диски. Вторым этапом осуществляется удаление всех, только что скопированных записей из таблицы ПРОКАТ. И третьим этапом осущетвляется обновление таблицы Архив_ПРОКАТ с целью внесения в нее названий фильмов, на случай когда будет произведено удаление информации о дисках «не в наличии». Выполнение этих трех этапов осуществляется с помощью одного макроса, и соответственно нажатия одной кнопки.

Архивирование шаг 1.

INSERT INTO Архив_ПРОКАТ ( КодОперации, Паспорт, КодДиска, ДатаОткрытия, ДатаЗакрытия, КодСтоимости, Коментарии )

SELECT ПРОКАТ.КодОперации, ПРОКАТ.Паспорт, ПРОКАТ.КодДиска, ПРОКАТ.ДатаОткрытия, ПРОКАТ.ДатаЗакрытия, ПРОКАТ.КодСтоимости, ПРОКАТ.Коментарии

FROM ПРОКАТ

WHERE (((ПРОКАТ.ДатаЗакрытия) Is Not Null));

Архивирование шаг 2.

DELETE ПРОКАТ.КодОперации, ПРОКАТ.Паспорт, ПРОКАТ.КодДиска, ПРОКАТ.ДатаОткрытия, ПРОКАТ.ДатаЗакрытия, ПРОКАТ.КодСтоимости, ПРОКАТ.Коментарии

FROM ПРОКАТ

WHERE (((ПРОКАТ.ДатаЗакрытия) Is Not Null));

Архивированиешаг 3.

UPDATE Архив_ПРОКАТ INNER JOIN (ФИЛЬМ INNER JOIN ДИСК ON (ФИЛЬМ.КодФильма = ДИСК.КодФильма) AND (ФИЛЬМ.КодФильма = ДИСК.КодФильма)) ON Архив_ПРОКАТ.КодДиска = ДИСК.КодДиска SET Архив_ПРОКАТ.Фильм = [ФИЛЬМ].[Название]

WHERE ((([ДИСК]![КодФильма])=[ФИЛЬМ]![КодФильма]));

Таблица ПРОКАТ до выполнения архивирования.

Таблица Архив_ПРОКАТ до выполнения архивирования

Таблица ПРОКАТ после выполнения архивирования.

Таблица Архив_ПРОКАТ после выполнения архивирования