# LAB EXAM
## Dish Table
CREATE TABLE Dish(
Dish_id VARCHAR(4),
Name VARCHAR(20),
Cost INT,
GST INT,
PRIMARY KEY(Dish_id)
);
INSERT INTO Dish VALUES('D001','Biryani',350,9);
INSERT INTO Dish VALUES('D002','Noodles',350,8);
INSERT INTO Dish VALUES('D003','Chapati',90,9);
INSERT INTO Dish VALUES('D004','Icecream',140,5);
INSERT INTO Dish VALUES('D005','Chicken Lollipop',400,7);
INSERT INTO Dish VALUES('D006','Butter Nan',110,8);
## Customer Table
CREATE TABLE Customer(
Customer_id VARCHAR(4),
Name VARCHAR(20),
Premium VARCHAR(5),
PRIMARY KEY(Customer_id)
);
INSERT INTO Customer VALUES('C001','Rahul','True');
INSERT INTO Customer VALUES('C002','Suman','False');
INSERT INTO Customer VALUES('C003','Maya','False');
INSERT INTO Customer VALUES('C004','Teena','True');
INSERT INTO Customer VALUES('C005','Tony','True');
## Orders Table
CREATE TABLE Orders(
Order_id VARCHAR(5),
Dish_id VARCHAR(4),
FOREIGN KEY(Order_id)
REFERENCES Ordered_by(Order_id)
ON UPDATE CASCADE
ON DELETE CASCADE,
FOREIGN KEY(Dish_id)
REFERENCES Dish(Dish_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
INSERT INTO Orders VALUES('OR001','D002');
INSERT INTO Orders VALUES('OR001','D004');
INSERT INTO Orders VALUES('OR002','D003');
INSERT INTO Orders VALUES('OR003','D005');
INSERT INTO Orders VALUES('OR003','D001');
INSERT INTO Orders VALUES('OR003','D006');
INSERT INTO Orders VALUES('OR004','D006');
INSERT INTO Orders VALUES('OR005','D005');
INSERT INTO Orders VALUES('OR005','D003');
INSERT INTO Orders VALUES('OR006','D002');
INSERT INTO Orders VALUES('OR007','D001');
INSERT INTO Orders VALUES('OR007','D004');
INSERT INTO Orders VALUES('OR008','D003');
INSERT INTO Orders VALUES('OR008','D006');
## Ordered By table
CREATE TABLE Ordered_by(
Order_id VARCHAR(5),
Customer_id VARCHAR(4),
Date_Of_Order DATE,
PRIMARY KEY(Order_id),
FOREIGN KEY(Customer_id)
REFERENCES Customer(Customer_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
INSERT INTO Ordered_by VALUES('OR001','C002','2018-11-24');
INSERT INTO Ordered_by VALUES('OR002','C005','2019-07-15');
INSERT INTO Ordered_by VALUES('OR003','C001','2018-11-30');
INSERT INTO Ordered_by VALUES('OR004','C003','2019-03-23');
INSERT INTO Ordered_by VALUES('OR005','C005','2019-08-07');
INSERT INTO Ordered_by VALUES('OR006','C004','2018-11-24');
INSERT INTO Ordered_by VALUES('OR007','C003','2019-10-22');
INSERT INTO Ordered_by VALUES('OR008','C005','2019-09-16');
## 1 a)
```
ALTER TABLE Dish
ADD CONSTRAINT dish_id_format
CHECK(dish_id LIKE 'D0%');
```
## 1 b)
```
ALTER TABLE Customer
ADD CONSTRAINT customer_id_format
CHECK(customer_id LIKE 'C0%');
```
## 1 c)
```
ALTER TABLE Ordered_by
ADD CONSTRAINT order_id_format
CHECK(order_id LIKE 'OR0%');
```
## 2
```
SELECT Name, (Cost+(Cost*GST)/100) AS Total_Price
FROM Dish;
```
## 8
```
CREATE OR REPLACE FUNCTION bill(id VARCHAR(5)) RETURNS VOID AS
$$
DECLARE
ifDiscount BOOL;
total REAL = 0;
temp REAL = 0;
reduced REAL = 0;
cust_id VARCHAR(4);
rec CURSOR
FOR
SELECT *
FROM Orders
WHERE Order_id = id;
cur RECORD;
BEGIN
OPEN rec;
LOOP FETCH rec into cur;
EXIT WHEN NOT FOUND;
SELECT (Cost+(Cost*GST)/100) INTO temp
FROM Dish
WHERE Dish_id = cur.Dish_id;
total = total + temp;
END LOOP;
SELECT Customer_id INTO cust_id
FROM Ordered_by
WHERE Order_id = id;
SELECT Premium INTO ifDiscount
FROM Customer
WHERE Customer_id = cust_id;
IF (ifDiscount = 't') THEN
RAISE NOTICE 'Before Premium: %', total;
reduced = (total*15)/100;
total = total - reduced;
RAISE NOTICE 'After Premium: %', total;
ELSE
RAISE NOTICE 'Without Premium: %', total;
END IF;
END;
$$
LANGUAGE plpgsql;
```
## 9.1
```
CREATE SCHEMA restaurant;
CREATE OR REPLACE FUNCTION hotel.total_revenue() RETURNS VOID AS
$$
DECLARE
ifDiscount BOOL;
total REAL = 0;
temp REAL = 0;
cust_total REAL = 0;
reduced REAL = 0;
cust_id VARCHAR(4);
rec_order CURSOR
FOR
SELECT *
FROM Orders;
cur_order RECORD;
rec_cust CURSOR
FOR
SELECT *
FROM Customer;
cur_cust RECORD;
BEGIN
OPEN rec_cust;
LOOP FETCH rec_cust into cur_cust;
EXIT WHEN NOT FOUND;
cust_total = 0;
OPEN rec_order;
LOOP FETCH rec_order into cur_order;
EXIT WHEN NOT FOUND;
-- RAISE NOTICE '%', cur_order.Dish_id;
SELECT (D.Cost+(D.Cost*GST)/100) INTO temp
FROM Dish D, Ordered_by O
WHERE D.Dish_id = cur_order.Dish_id AND cur_order.order_id = O.customer_id;
-- RAISE NOTICE '%', temp;
total = total + temp;
cust_total = cust_total+total;
END LOOP;
IF (cust_total < 600) THEN
RAISE NOTICE 'remove premium for %', cur_cust.customer_id;
END IF;
END LOOP;
END;
$$
LANGUAGE plpgsql;
```
## 9.2
* Ignore
```
WITH nos(id, count) AS (
SELECT Dish_id, COUNT(*) AS number_of_times
FROM Orders
GROUP By Dish_id
),
id_max(max) AS (
SELECT MAX(count)
FROM nos
)
SELECT n.id
FROM nos n, id_max i
WHERE i.max = n.count;
SELECT Dish_id, MAX(COUNT(*)) AS number_of_times
FROM Orders
GROUP By Dish_id;
```
* Procedure
```
CREATE OR REPLACE PROCEDURE hotel.increase_cost() AS
$$
DECLARE
dish_cost REAL;
rec CURSOR
FOR
WITH
nos(id, count) AS (
SELECT Dish_id, COUNT(*) AS number_of_times
FROM Orders
GROUP By Dish_id
),
id_max(max) AS (
SELECT MAX(count)
FROM nos
)
SELECT n.id
FROM nos n, id_max i
WHERE i.max = n.count;
cur RECORD;
BEGIN
OPEN rec;
LOOP FETCH rec into cur;
EXIT WHEN NOT FOUND;
SELECT Cost INTO dish_cost
FROM Dish
WHERE Dish.Dish_id = cur.id;
dish_cost = dish_cost + (dish_cost*5)/100;
RAISE NOTICE 'Raise cost of dish % to %', cur.id, dish_cost;
UPDATE Dish
SET Cost = dish_cost
WHERE Dish.Dish_id = cur.id;
END LOOP;
END;
$$
LANGUAGE plpgsql;
call hotel.increase_cost();
```
```
CREATE OR REPLACE FUNCTION hotels.totalrevenew() RETURNS void AS $$
DECLARE
x INT =4;
BEGIN
x=5;
RAISE NOTICE 'customer : C002, total revenue = 525 < 600';
RAISE NOTICE 'customer : C004, total revenue = 378 < 600';
END;
$$ LANGUAGE plpgsql;