Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД_ресторан_5семестр.doc
Скачиваний:
0
Добавлен:
23.01.2026
Размер:
1.76 Mб
Скачать
  1. Представление «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. Пример работы представления разных заказов

    1. Функции

  1. Скалярная функция «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. Выполнение запроса

  1. Табличная функция «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. Выполнение запроса

  1. Табличная функция «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. Выполнение запроса

  1. Табличная функция «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. Выполнение запроса