Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added ERD.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 22 additions & 0 deletions queries/createIndexes.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@



Comment on lines +1 to +3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need for these leading spaces

use RestaurantReservation ;

-- 1. ReservationId in Orders table
CREATE INDEX idx_orders_reservationid ON Orders(ReservationId);

-- 2. RestaurantId in Reservations table
CREATE INDEX idx_reservations_restaurantid ON Reservations(RestaurantId);

-- 3. OrderId in OrderItems table
CREATE INDEX idx_orderitems_orderid ON OrderItems(OrderId);

-- 4. ItemId in OrderItems table
CREATE INDEX idx_orderitems_itemid ON OrderItems(ItemId);

-- 5. EmployeeId in Orders table
CREATE INDEX idx_orders_employeeid ON Orders(EmployeeId);

-- 6. ReservationDate in Reservations table
CREATE INDEX idx_reservations_reservationdate ON Reservations(ReservationDate);
25 changes: 25 additions & 0 deletions queries/fn_CalculateEmployeeSalary.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

-- **Database Function - Calculate Employees Salary**:
-- **Function Name**: **`fn_CalculateEmployeeSalary`**
-- **Purpose**: Compute the salary for a given employee.
-- **Parameter**: `EmployeeId`
-- **Implementation**: Salary is defined as: # number of orders made by specific employee * employee rank.
-- Employee�s rank based on position: Position = `VIPOrdersWaiter` = 5, `StandardWaiter` = 4, `AssistantWaiter` = 3.
-- **Return**: salary for the `EmployeeId`.

CREATE FUNCTION fn_CalculateEmployeeSalary(@EmployeeId INT)
RETURNS INT as
begin
DECLARE @cnt INT=(select count(*) from Orders where EmployeeId=@EmployeeId);
DECLARE @pos NVARCHAR(100) = (SELECT Position FROM Employees WHERE EmployeeId = @EmployeeId);
DECLARE @rank INT = CASE
WHEN @pos = 'VIPOrdersWaiter' THEN 5
WHEN @pos = 'StandardWaiter' THEN 4
WHEN @pos = 'AssistantWaiter' THEN 3
ELSE 2 END;
RETURN ISNULL(@cnt,0) * @rank;
end;
SELECT dbo.fn_CalculateEmployeeSalary(2) AS SalaryForEmployee2;



Comment on lines +22 to +25

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, remove additional spaces

19 changes: 19 additions & 0 deletions queries/fn_CalculateRevenue.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

-- **Database Function - Calculate Restaurant Revenue**:
-- - **Function Name**: **`fn_CalculateRevenue`**
-- - **Purpose**: Compute revenue made by a specific restaurant.
-- - **Parameter**: `RestaurantId`
-- - **Return**: total revenue amount for the `RestaurantId` .

create function fn_CalculateRevenue(@RestaurantId INT)
RETURNS DECIMAL(18,2) as
begin
return(
select ISNULL(SUM(O.TotalAmount),0)
from Orders O
JOIN Reservations r ON o.ReservationId = r.ReservationId
WHERE r.RestaurantId = @RestaurantId
);
end;

SELECT dbo.fn_CalculateRevenue(3) AS RevenueForRestaurant1;
20 changes: 20 additions & 0 deletions queries/helperFun.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

-- 13. **Stored Procedure - Borrowed Books Report**:
-- **Procedure Name**: **`sp_ResrvedTablesReport`**
-- **Purpose**: Generate a report of tables reserved within a specified date range.
-- **Parameters**: **`StartDate`**, **`EndDate`**
-- **Implementation**: Retrieve all tables reserved within the given range, with details like reservation date, party size and restaurant details.
-- **Return**: Tabulated report of reserved tables

-- GET NEW ID FOR INSERT NEW ORDER
CREATE FUNCTION dbo.fn_GetNextOrderId()
RETURNS INT
AS
BEGIN
DECLARE @NextId INT;

SELECT @NextId = ISNULL(MAX(OrderId), 0) + 1
FROM Orders;

RETURN @NextId;
END;
8 changes: 8 additions & 0 deletions queries/q01_list_reservations_for_customer.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@

use RestaurantReservation ;
-- List all reservations for a specific customer

DECLARE @CustomerId INT = 1;
SELECT *
FROM Reservations
WHERE CustomerId=@CustomerId;
7 changes: 7 additions & 0 deletions queries/q02_list_managers.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

use RestaurantReservation ;
-- List of Managers: Retrieve all employees holding Manager position.

SELECT *
FROM Employees
WHERE Position = 'Manager';
13 changes: 13 additions & 0 deletions queries/q03_orders_and_menuitems_for_reservation.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

use RestaurantReservation ;
--List of Orders and Menu Items: Lists the orders placed on a specific given reservation along with the associated menu items.

DECLARE @ReservationId INT = 1;
SELECT *
FROM Orders O
JOIN OrderItems OI
ON O.OrderId=OI.OrderId
JOIN MenuItems MI
ON MI.ItemId=OI.ItemId
WHERE O.ReservationId = @ReservationId;

13 changes: 13 additions & 0 deletions queries/q04_ordered_menuitems_for_reservation.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

use RestaurantReservation ;
--List of Ordered Menu Items: Lists the menu items ordered by a specific reservation.

DECLARE @ReservationId INT = 1;
SELECT MI.*
FROM Orders O
JOIN OrderItems OI
ON O.OrderId = OI.OrderId
JOIN MenuItems MI
ON OI.ItemId = MI.ItemId
WHERE o.ReservationId = @ReservationId;

12 changes: 12 additions & 0 deletions queries/q05_avg_order_amount_by_employee.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

use RestaurantReservation ;
--Calculate Average Order Amount: Calculate the average order amount made through a specific employee.

DECLARE @EmployeeId INT =7;

SELECT emp.EmployeeId,emp.FirstName,emp.LastName, AVG(TotalAmount) AS AvgAmount
FROM Orders o
join Employees emp
on o.EmployeeId=emp.EmployeeId

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add space before and after =

WHERE o.EmployeeId = @EmployeeId
group by emp.EmployeeId,emp.FirstName,emp.LastName;
15 changes: 15 additions & 0 deletions queries/q08_reservations_with_2plus_orders_cte.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

--Reservation�s Order with CTEs: Identify reservations which have 2 or more orders using CTEs.


WITH OrdersPerReservation AS (
SELECT ReservationId, COUNT(*) AS OrdersCount
FROM Orders
WHERE ReservationId IS NOT NULL
GROUP BY ReservationId
)
SELECT *
FROM Reservations R
JOIN OrdersPerReservation OPR
ON R.ReservationId=OPR.ReservationId
WHERE OPR.OrdersCount>=2;
11 changes: 11 additions & 0 deletions queries/q09_restaurant_popularity.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

--Restaurant Popularity using Aggregation: Rank restaurants by the reservation frequency.



SELECT r.RestaurantId, r.Name,
COUNT(res.ReservationId) AS ReservationCount
FROM Restaurants r
LEFT JOIN Reservations res ON r.RestaurantId = res.RestaurantId
GROUP BY r.RestaurantId, r.Name
ORDER BY ReservationCount DESC;
22 changes: 22 additions & 0 deletions queries/q10_popular_menu_item_per_restaurant_month.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

--Popular Menu Item Analysis using Joins and Window Functions: Identify the most popular menu item for each restaurant for a given month.
DECLARE @Year INT = 2025;
DECLARE @Month INT = 5;


;WITH ItemsInMonth AS (

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove extra comma

SELECT mi.RestaurantId, mi.ItemId, mi.Name,
SUM(oi.Quantity) AS QtySold
FROM OrderItems oi
JOIN Orders o ON oi.OrderId = o.OrderId
JOIN MenuItems mi ON oi.ItemId = mi.ItemId
WHERE YEAR(o.OrderDate) = @Year AND MONTH(o.OrderDate) = @Month
GROUP BY mi.RestaurantId, mi.ItemId, mi.Name
),Ranked AS (

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

separating queries by adding one line between each two, would make it easier to understand.

SELECT RestaurantId, ItemId, Name, QtySold,
ROW_NUMBER() OVER (PARTITION BY RestaurantId ORDER BY QtySold DESC) AS rn
FROM ItemsInMonth
)SELECT RestaurantId, ItemId, Name, QtySold
FROM Ranked
WHERE rn = 1
ORDER BY RestaurantId;
59 changes: 59 additions & 0 deletions queries/sp_AddNewOrder.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@



-- **Stored Procedure - Add New Order**:
-- **Procedure Name**: **`sp_AddNewOrder`**
-- **Purpose**: Streamline the process of adding a new order.
-- **Parameters**: **`ReservationId`**, **`EmployeeId`**, **`OrderDate`**, and **`TotalAmount`**.
-- **Implementation**: Check if the specified reservation and employee exist, if not, return an error message, if existing, add new order.
-- **Return**: The new **`OrderId`** or an error message.

IF OBJECT_ID('dbo.sp_AddNewOrder','P') IS NOT NULL
DROP PROCEDURE dbo.sp_AddNewOrder;
GO

CREATE PROCEDURE dbo.sp_AddNewOrder
@ReservationId INT,
@EmployeeId INT,
@OrderDate DATETIME,
@TotalAmount DECIMAL(12,2)
AS
BEGIN
SET NOCOUNT ON;


IF NOT EXISTS (SELECT 1 FROM Reservations WHERE ReservationId = @ReservationId)
BEGIN
RAISERROR('Reservation not found (ReservationId=%d).',16,1,@ReservationId);
RETURN -1;
END


IF NOT EXISTS (SELECT 1 FROM Employees WHERE EmployeeId = @EmployeeId)
BEGIN
RAISERROR('Employee not found (EmployeeId=%d).',16,1,@EmployeeId);
RETURN -2;
END


DELETE FROM Orders
WHERE ReservationId = @ReservationId;


INSERT INTO Orders (OrderId, ReservationId, EmployeeId, OrderDate, TotalAmount)
VALUES (dbo.fn_GetNextOrderId(), @ReservationId, @EmployeeId, @OrderDate, @TotalAmount);


SELECT MAX(OrderId) AS NewOrderId FROM Orders;
END;
GO


EXEC dbo.sp_AddNewOrder
@ReservationId = 1,
@EmployeeId = 2000,
@OrderDate = '2025-09-29 14:35',
@TotalAmount = 50.00;

SELECT MAX(OrderId) AS NewOrderId FROM Orders;
select * from Orders;
42 changes: 42 additions & 0 deletions queries/sp_FutureReservedTables.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@


--15. **SQL Stored Procedure with Temp Table**:
-- Design a stored procedure that retrieves all tables which have future reservations.
-- Store these tables in a temporary table, then join this temp table with the **`Restaurants`**
-- table to list out the specific information about the associated restaurants.
use RestaurantReservation ;

CREATE PROCEDURE dbo.sp_FutureReservedTables
AS
BEGIN
SET NOCOUNT ON;


IF OBJECT_ID('tempdb..#FutureTables') IS NOT NULL
DROP TABLE #FutureTables;


SELECT DISTINCT
t.TableId,
t.RestaurantId,
t.Capacity
INTO #FutureTables
FROM Tables t
JOIN Reservations r ON t.TableId = r.TableId
WHERE r.ReservationDate > GETDATE();


SELECT
ft.TableId,
ft.RestaurantId,
ft.Capacity,
res.Name AS RestaurantName,
res.Address AS RestaurantAddress,
res.PhoneNumber AS RestaurantPhone
FROM #FutureTables ft
LEFT JOIN Restaurants res ON ft.RestaurantId = res.RestaurantId
ORDER BY res.Name, ft.TableId;

END;

EXEC dbo.sp_FutureReservedTables;
25 changes: 25 additions & 0 deletions queries/sp_ResrvedTablesReport.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

-- 13. **Stored Procedure - Borrowed Books Report**:
-- **Procedure Name**: **`sp_ResrvedTablesReport`**
-- **Purpose**: Generate a report of tables reserved within a specified date range.
-- **Parameters**: **`StartDate`**, **`EndDate`**
-- **Implementation**: Retrieve all tables reserved within the given range, with details like reservation date, party size and restaurant details.
-- **Return**: Tabulated report of reserved tables

CREATE PROCEDURE sp_ResrvedTablesReport
@StartDate DATETIME,
@EndDate DATETIME
AS
begin
SELECT r.ReservationId, r.ReservationDate, r.PartySize,
rest.RestaurantId, rest.Name AS RestaurantName, rest.Address, rest.PhoneNumber,
r.TableId,
r.CustomerId
FROM Reservations r
JOIN Restaurants rest ON r.RestaurantId = rest.RestaurantId
WHERE r.ReservationDate BETWEEN @StartDate AND @EndDate

end;
EXEC dbo.sp_ResrvedTablesReport '2025-01-01','2025-02-28';


25 changes: 25 additions & 0 deletions queries/trg_LogReservationAudit.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@


--16. **Trigger Implementation**
-- Design a trigger to log an entry into a separate **`AuditLog`** table whenever a table get reserved.
--The **`AuditLog`** should capture `ResturantId`, `TableId`, `ReservationDate` and **`ChangeDate`**.

use RestaurantReservation ;

CREATE TABLE dbo.AuditLog (
AuditId INT IDENTITY(1,1) PRIMARY KEY,
RestaurantId INT,
TableId INT,
ReservationDate DATETIME,
ChangeDate DATETIME DEFAULT GETDATE()
);

CREATE TRIGGER dbo.trg_LogReservation
ON dbo.Reservations
AFTER INSERT
AS
BEGIN
INSERT INTO dbo.AuditLog (RestaurantId, TableId, ReservationDate)
SELECT RestaurantId, TableId, ReservationDate
FROM inserted;
END;
12 changes: 12 additions & 0 deletions queries/vw_EmployeesFull.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

--Retrieve Employees details with Views: Use a view to list all employees information including their restaurants details


CREATE VIEW EmployeesFull
AS
SELECT e.EmployeeId, e.FirstName, e.LastName, e.Position, e.RestaurantId,
r.Name AS RestaurantName, r.Address AS RestaurantAddress, r.PhoneNumber AS RestaurantPhone
FROM Employees e
JOIN Restaurants r ON e.RestaurantId = r.RestaurantId;

SELECT * FROM EmployeesFull;
14 changes: 14 additions & 0 deletions queries/vw_ReservationsFull.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

--Retrieve Reservations Report with Views: Use a view to list all reservations information including restaurants and customers information.


CREATE VIEW ReservationsReport AS
SELECT r.ReservationId, r.ReservationDate, r.PartySize, r.TableId,
c.CustomerId, c.FirstName AS CustomerFirstName, c.LastName AS CustomerLastName, c.Email, c.PhoneNumber AS CustomerPhone,
res.RestaurantId, res.Name AS RestaurantName, res.Address AS RestaurantAddress, res.PhoneNumber AS RestaurantPhone

FROM Reservations r
JOIN Customers c ON r.CustomerId = c.CustomerId
JOIN Restaurants res ON r.RestaurantId = res.RestaurantId;

SELECT * FROM ReservationsReport;
Loading