-- Calculate the total revenue generated by each store for year 2018.
SELECT
[Store Name] = S.store_name,
[Gross Revenue] = FORMAT(SUM(OI.list_price*OI.quantity), 'N0'),
[Net Revenue] = FORMAT(SUM((OI.list_price*OI.quantity)-((OI.list_price*OI.quantity)*OI.discount)), 'N0')
FROM
order_items OI join orders O on O.order_id = OI.order_id join stores S on O.store_id = S.store_id
WHERE 
YEAR(O.order_date) = 2018
GROUP BY
S.store_name

--  Find the top 5 selling products across all stores based on the quantity sold.
WITH RankedProducts AS (
    SELECT
        [Product Name] = P.product_name,
        [qty_Sold] = SUM(OI.quantity),
        [RANK] = DENSE_RANK() OVER (ORDER BY SUM(OI.quantity) DESC)
    FROM
        order_items OI
        JOIN products P ON OI.product_id = P.product_id
    GROUP BY
        P.product_name
)
SELECT DISTINCT
    [Product Name],
    [qty_Sold],
    [RANK]
FROM
    RankedProducts
WHERE
    [RANK] <= 5;


-- Retrieve Jamaal Albert and Melia Brady's order history, including the order date, product details, and total amount spent.
SELECT
[Customer Name] = CONCAT(CU.first_name , ' ' , CU.last_name),
[Order Date] = O.order_date,
[Product details] = P.product_name,
[Category] = C.category_name,
[Amount spent] = FORMAT(SUM((OI.list_price*OI.quantity)-((OI.list_price*OI.quantity)*OI.discount)),'N0')
FROM
orders O 
join order_items OI on O.order_id = OI.order_id 
join products P on OI.product_id = P.product_id 
join categories C on P.category_id = C.category_id
join customers CU on CU.customer_id = O.customer_id
WHERE (CU.first_name = 'Jamaal' and CU.last_name = 'Albert') OR (CU.first_name = 'Melia' and CU.last_name = 'Brady')
GROUP BY
CONCAT(CU.first_name, ' ' , CU.last_name), O.order_date, P.product_name, C.category_name
ORDER BY
[Customer Name] asc


-- List the products that are running low on stock (quantity less than 10) in each store.
SELECT
[Store Name] = S.store_name,
[Product Name] = P.product_name,
[Stocks] = SUM(ST.quantity)
FROM
stores S join stocks ST on S.store_id = ST.store_id join products P on ST.product_id = P.product_id
GROUP BY store_name, product_name
HAVING SUM(ST.quantity) < 10
ORDER BY [Stocks] desc

-- List the products that are running low on stock (quantity less than 10) in each store.
SELECT
[Store  Name],
[Product Name],
[Sum Qty]
FROM (
    SELECT
    [Store  Name] = S.store_name,
    [Product Name] = P.product_name,
    [Sum Qty] = SUM(ST.quantity)
    FROM
    stores S join stocks ST on S.store_id = ST.store_id join products P on ST.product_id = P.product_id
    GROUP BY
    store_name, product_name
) as SUBQQ
WHERE [Sum Qty] < 10

--  Identify the top 5 staff members who have processed the highest total value of orders.
SELECT TOP 5
[Staff Name] = CONCAT(ST.first_name, ' ' , ST.last_name),
[Orders Processed] = COUNT(O.order_id)
FROM staffs ST join orders O on ST.staff_id = O.staff_id
GROUP BY ST.first_name, ST.last_name
ORDER BY [Orders Processed] desc

-- category wise sales percentage XX
SELECT
[Category Name] = C.category_name,
[Total Sales] = FORMAT(SUM((OI.list_price*OI.quantity)-((OI.list_price*OI.quantity)*OI.discount)),'N0'),
[Percentage] = FORMAT((SUM((OI.list_price*OI.quantity)-((OI.list_price*OI.quantity)*OI.discount)) / 
				SUM(SUM((OI.list_price * OI.quantity) - ((OI.list_price * OI.quantity) * OI.discount))) OVER ()),'#.##%')
FROM
categories C join products P on C.category_id = P.category_id join order_items OI on OI.product_id = P.product_id
GROUP BY C.category_name
ORDER BY [Percentage] desc

-- Identify staff members who are marked as inactive (1) and have not processed any orders.
SELECT
[Staff Name] = CONCAT(S.first_name, ' ' , S.last_name)
FROM staffs S join orders O on O.staff_id = S.staff_id
WHERE S.active = 1
GROUP BY S.first_name, S.last_name
HAVING count(O.order_id) = 0

-- Customer Loyalty
WITH Loyalty AS(
	SELECT
	[Customer Name] = CONCAT(C.first_name, ' ' , C.last_name),
	[Stores] = S.store_name,
	[Store_Orders] = COUNT(DISTINCT S.store_name),
	[Count_Orders] = COUNT(O.order_id),
	[Avg_Spending] = AVG((OI.list_price*OI.quantity)-((OI.list_price*OI.quantity)*OI.discount))
	FROM
	customers C 
	join orders O on C.customer_id = O.customer_id 
	join order_items OI on O.order_id = OI.order_id
	join stores S on S.store_id = O.store_id
	GROUP BY
	C.first_name, C.last_name, S.store_name, O.order_id
)
SELECT
[Customer Name],
[Stores],
[Count_Orders],
[Avg_Spending]
FROM
Loyalty
WHERE [Store_Orders] > 1

-- Calculate the average discount amount applied to products in each product category.
SELECT
[Product Category] = C.category_name,
[Average Discount] = FORMAT(AVG(OI.list_price*OI.discount),'N0')
FROM 
categories C 
join products P on C.category_id = P.category_id 
join order_items OI on OI.product_id = P.product_id
GROUP BY
C.category_name


