cs348/Project_2/answer.sql
2018-11-05 17:23:59 -05:00

189 lines
4.4 KiB
SQL
Executable File

set serveroutput on size 32000
-- show errors;
-- Question 1: Retailer detail
create or replace procedure RetailerDetail (id IN Retailers.RetailerId%TYPE) as
retailer_id Retailers.RetailerId%TYPE;
retailer_name Retailers.RetailerName%TYPE;
retailer_address Retailers.Address%TYPE;
retailer_orders Orders.Count%TYPE;
retailer_bestseller_id Products.ProductId%TYPE;
retailer_bestseller Products.ProductName%TYPE;
retailer_bestseller_count Orders.Count%TYPE;
-- CURSOR retailer_cursor IS SELECT RetailerId FROM Retailers WHERE RetailerId=id;
-- retailer_entry retailer_cursor%ROWTYPE;
CURSOR order_cursor IS SELECT Count, OrderId FROM Orders WHERE RetailerId=id;
order_entry order_cursor%ROWTYPE;
BEGIN
SELECT RetailerName
INTO retailer_name
FROM Retailer
WHERE RetailerId=id;
SELECT Address
INTO retailer_address
FROM Retailer
WHERE RetailerId=id;
SELECT COUNT(OrderId)
INTO retailer_orders
FROM Orders
WHERE RetailerId=id;
SELECT ProductId
INTO retailer_bestseller_id
FROM (
SELECT ProductId, RANK()
OVER (ORDER BY Total DESC) AS Score
FROM (
SELECT ProductId, SUM(Count) AS Total
FROM Orders O
WHERE RetailerId=id
GROUP BY ProductId
)
)
WHERE Score = 1
GROUP BY ProductId;
SELECT ProductName
INTO retailer_bestseller
FROM Products
WHERE ProductId=retailer_bestseller_id;
SELECT SUM(Count)
INTO retailer_bestseller_count
FROM Orders
WHERE ProductId=retailer_bestseller_id AND RetailerId=id;
dbms_output.put_line('Retailer Name: ' || retailer_name);
dbms_output.put_line('Retailer Address: ' || retailer_address);
dbms_output.put_line('Retailer Total Orders: ' || retailer_orders);
dbms_output.put_line('Most Popular Product: ' || retailer_bestseller);
dbms_output.put_line('Total Sold: ' || retailer_bestseller_count);
END RetailerDetail;
/
-- show error procedure RetailerDetail;
-- make test cases yourselves
BEGIN
RetailerDetail(1); -- Inferno, 115
RetailerDetail(2); -- Macbook, 12
RetailerDetail(3); -- Nike sports jacket, 3
RetailerDetail(4); -- OnePlus 5t, 1
RetailerDetail(5); -- Pixel Book, 1
end;
/
-- Queation 2: Monthly delay report
create or replace procedure MonthlyDelayReport as
order_date VARCHAR(32);
order_count Orders.Count%TYPE;
order_year VARCHAR(32);
order_month VARCHAR(32);
retailer_name Retailers.RetailerName%TYPE;
CURSOR c_month IS
SELECT Year, Month, Total
FROM (
SELECT Year, Month, COUNT(OrderId) AS Total
FROM (
-- EXTRACT
SELECT EXTRACT(YEAR FROM OrderDate) AS Year, EXTRACT(MONTH FROM OrderDate) AS Month, OrderId, Status
FROM Orders
)
WHERE Status = 'DELAYED'
GROUP BY Year, Month
ORDER BY Year ASC, Month ASC
)
WHERE Total > 0;
CURSOR c_retailer IS
SELECT DISTINCT R.RetailerName
INTO retailer_name
FROM (
SELECT RetailerId
FROM Orders
WHERE EXTRACT(YEAR FROM OrderDate) = order_year AND EXTRACT(MONTH FROM OrderDate) = order_month AND Status = 'DELAYED'
) K, Retailers R
WHERE R.RetailerId = K.RetailerId
ORDER BY R.RetailerName ASC;
BEGIN
OPEN c_month;
LOOP
FETCH c_month INTO order_year, order_month, order_count;
EXIT WHEN c_month%NOTFOUND;
dbms_output.put_line('Delayed Orders in ' || order_year || '-' || order_month || ': ' || order_count);
OPEN c_retailer;
LOOP
FETCH c_retailer INTO retailer_name;
EXIT WHEN c_retailer%NOTFOUND;
dbms_output.put_line('- ' || retailer_name);
END LOOP;
CLOSE c_retailer;
END LOOP;
CLOSE c_month;
END MonthlyDelayReport;
/
show error procedure MonthlyDelayReport;
BEGIN
MonthlyDelayReport;
End;
/
-- Question 3: Find the product with least profit in each category
-- create or replace procedure LeastProfitProduct as
-- BEGIN
-- END LeastProfitProduct;
-- /
-- BEGIN
-- LeastProfitProduct;
-- END;
-- /
-- Queation 4: New table for retailer product category distribution
-- create table RetailerCatergoryTable(RetailerId integer, Electronic integer, Apparel integer, Books integer, primary key(RetailerId));
-- create or replace procedure RetailerProductCatergory as
-- BEGIN
-- END RetailerProductCatergory;
-- /
-- BEGIN
-- RetailerProductCatergory;
-- END;
-- /
-- select * from RetailerCatergoryTable;
-- drop table RetailerCatergoryTable;
-- Question 5: Exception Handle
-- create or replace procedure CustomerProductInfo(cid IN Customers.CustomerId%TYPE, pid IN Products.ProductId%TYPE) as
-- BEGIN
-- EXCEPTION
-- END CustomerProductInfo;
-- /
-- BEGIN
-- CustomerProductInfo(1,1);
-- END;
-- /
-- BEGIN
-- CustomerProductInfo(-1,1);
-- END;
-- /