- •Аннотация
- •Содержание
- •Введение
- •1. Формулировка задания
- •1.1. Задание
- •1.2. Структура идз
- •Описание предметной области
- •Проектирование базы данных
- •Создание бАзы данных
- •Создание таблиц и ограничений целостности
- •Заполнение таблиц данными
- •Заполнение таблицы «Staff» (Сотрудники)
- •Заполнение таблицы «Tables» (Столы):
- •Заполнение таблицы «Categories» (Категории)
- •Заполнение таблицы «MenuItems» (Меню)
- •Заполнение таблицы «Orders» (Заказы)
- •Заполнение таблицы «OrderItems» (Позиции заказа)
- •Заполнение таблицы «Payments» (Платежи)
- •Разработка объектов промежуточного слоя
- •Хранимые процедуры
- •Процедура «CreateOrder» для создания нового заказа
- •Процедура «AddItemToOrder» для добавления позиций в заказ
- •Процедура «SetOrderWaitingForPayment» для перевода заказа в статус ожидания оплаты
- •Процедура «PayOrder» для оплаты заказа
- •Представления
- •Представление «ActiveOrders» для просмотра активных заказов
- •Представление «WaiterDailyRevenue», показывающее выручку, принесённую каждым из официантов
- •Представление «DailyOrderStats», показывающее по дням заработок ресторана, оплаченные заказы, средний чек
- •Представление «OrdersByWaiterStatus», показывающее количество заказов, обслуженных каждым из официантов по статусам заказа
- •Функции
- •Скалярная функция «OrderTotal» для подсчета стоимости заказа
- •Табличная функция «GetOrdersWithTotal», которая возвращает блюда по заказам
- •Табличная функция «GetMenuItemsByAvailability», показывающая оставшиеся блюда
- •Табличная функция «GetLastOrderItems» возвращающая последние блюда в заказах
- •Скалярная функция «MenuItemSalesPaid» для подсчета проданных позиций блюд в день
- •Разработка триггеров
- •Триггер «InsertWaiterTable» для вставки в таблицу WaiterTables, когда происходит заказ
- •Триггер «CheckStock», уменьшающий количество блюд в MenuItems и предупреждающий, если блюда закончились
- •Триггер «PreventWaitingPaymentWithoutItems», проверяющий пустой заказ
- •Разработка стратегии резервного копирования и восстановления
- •Процедура полного резервного копирования
- •Процедура дифференциального резервного копирования
- •Процедура резервного копирования журнала транзакций
- •Процедура тестирования всех бэкапов
- •Автоматизация через sql server agent
- •Процедура восстановления
- •Заключение
- •Список использованных источников
Представление «OrdersByWaiterStatus», показывающее количество заказов, обслуженных каждым из официантов по статусам заказа
С помощью этого представления можно узнать, сколько принятых, оплаченных и ожидающих оплату заказов у каждого из официантов.
Запрос:
CREATE VIEW rest.v_OrdersByWaiterStatus AS
SELECT
WaiterName,
[Принят],
[Оплачен],
[Ожидает оплаты]
FROM (
SELECT
s.FirstName + ' ' + s.LastName AS WaiterName,
o.Status,
1 AS Cnt
FROM rest.Orders o
JOIN rest.Staff s ON o.WaiterID = s.StaffID
) AS src
PIVOT
(
COUNT(Cnt)
FOR Status IN ([Принят], [Оплачен], [Ожидает оплаты])
) AS p;
GO
Пример использования:
SELECT
WaiterName,
[Принят],
[Оплачен],
[Ожидает оплаты]
FROM rest.v_OrdersByWaiterStatus;
Выполнение запроса (рис. 36)
Рисунок 36. Пример работы представления разных заказов
Функции
Скалярная функция «OrderTotal» для подсчета стоимости заказа
Запрос:
CREATE FUNCTION rest.ufn_OrderTotal (@OrderID INT)
RETURNS DECIMAL(10,2)
AS
BEGIN
DECLARE @Total DECIMAL(10,2);
SELECT @Total = SUM(oi.ItemTotal)
FROM rest.OrderItems oi
WHERE oi.OrderID = @OrderID;
RETURN ISNULL(@Total, 0);
END;
GO
Пример использования:
SELECT rest.ufn_OrderTotal(6)
Результат выполнения запроса для шестого заказа:
Рисунок 36. Выполнение запроса
Табличная функция «GetOrdersWithTotal», которая возвращает блюда по заказам
Запрос:
CREATE FUNCTION rest.fn_GetOrdersWithTotal()
RETURNS TABLE
AS
RETURN
(
SELECT
o.OrderID,
o.TableID,
o.WaiterID,
o.Status,
COUNT(oi.ItemID) AS ItemCount,
SUM(oi.Quantity * oi.UnitPrice) AS TotalAmount
FROM rest.Orders o
LEFT JOIN rest.OrderItems oi ON o.OrderID = oi.OrderID
GROUP BY o.OrderID, o.TableID, o.WaiterID, o.Status
);
GO
Пример использования:
SELECT OrderID,
TableID,
WaiterID,
Status,
ItemCount,
TotalAmount
FROM rest.fn_GetOrdersWithTotal()
Данная функция показывает информацию обо всех заказах и сумму для оплаты (рис. 37).
Рисунок 37. Выполнение запроса
Табличная функция «GetMenuItemsByAvailability», показывающая оставшиеся блюда
CREATE FUNCTION rest.fn_GetMenuItemsByAvailability()
RETURNS TABLE
AS
RETURN
(
SELECT ItemID, ItemName, Price, Stock
FROM rest.MenuItems
WHERE IsAvailable = 1 AND Stock > 0
);
GO
Пример использования:
SELECT
ItemID,
ItemName,
Price,
Stock
FROM rest.fn_GetMenuItemsByAvailability()
ORDER BY ItemName;
Результат выполнения (рис. 38).
Рисунок 38. Выполнение запроса
Табличная функция «GetLastOrderItems» возвращающая последние блюда в заказах
Запрос:
CREATE FUNCTION rest.fn_GetLastOrderItems(
@OrderID INT,
@TopN INT
)
RETURNS TABLE
AS
RETURN
(
SELECT TOP(@TopN)
oi.ItemID,
mi.ItemName,
oi.Quantity,
oi.UnitPrice
FROM rest.OrderItems oi
JOIN rest.MenuItems mi ON oi.ItemID = mi.ItemID
WHERE oi.OrderID = @OrderID
ORDER BY oi.OrderItemID DESC
);
GO
Пример использования:
SELECT
o.OrderID,
o.TableID,
oi.ItemID,
oi.ItemName,
oi.Quantity
FROM rest.Orders o
CROSS APPLY rest.fn_GetLastOrderItems(o.OrderID, 3) AS oi
WHERE o.Status = 'Принят';
После выполнения запроса видим последние 3 заказанных блюда в каждом заказе (рис. 39).
Рисунок 39. Выполнение запроса
