A company sells different products on the internet. For the sake of this example, lets say it sells bicycles, scooters and lawn mowers. Everyday, customers order different quantities of these three products. The company's capacity is to ship upto 25% of pending orders by sale amount of each product everyday. And the company wants to meet its capacity every weekday while making sure that customers are being served as per their order date starting with the earliest
pending order for a given product. For example, if there are pending orders worth $1000 for bicycles today, bicycles worth upto $250 should be shipped today in the order in which orders were placed by the customers. At the same time, orders should be shipped in full and not partially.
I am using just one table for this demo. It is not in the third normal form just to make the explanation simple. So lets create a base table with the relevant sample data. Please note that the code below is compatible with microsoft SQL Server 2008. With slight modifications, it can work in Microsoft SQL Server 2005 as well :
if exists (select * from sys.tables
where Schema_NAME(schema_ID) = 'dbo'
and name = 'Order_details')
begin
drop table dbo.Order_details
end;
create table dbo.Order_details
(Order_ID int identity(1, 1) primary key clustered with (fillfactor = 50, data_compression = page)
,Order_Date smalldatetime not null
,Product_Name varchar(50) not null
,Unit_Price decimal(28,2) not null
,Quantity_Ordered smallint not null
,Order_Value as (Quantity_Ordered * Unit_Price)
,Order_Value_As_Percent_of_Pending_Orders_By_Product decimal(28, 10) null
,CutOff_Value_By_Product decimal(28, 10) null
,Ship_It_Today bit not null default (0)
,Shipping_Date smalldatetime null)
Next, let us populate the table, dbo.Order_Details.
insert into dbo.Order_details (Order_Date, Product_Name, Unit_Price, Quantity_Ordered)
--10 orders for bicycles
values (GETDATE()-10 , 'Bicycle', 100.00, 1)
,(GETDATE()-9 , 'Bicycle', 100.00, 2)
,(GETDATE()-8 , 'Bicycle', 100.00, 3)
,(GETDATE()-7 , 'Bicycle', 100.00, 4)
,(GETDATE()-6 , 'Bicycle', 100.00, 5)
,(GETDATE()-5 , 'Bicycle', 100.00, 6)
,(GETDATE()-4 , 'Bicycle', 100.00, 7)
,(GETDATE()-3 , 'Bicycle', 100.00, 8)
,(GETDATE(), 'Bicycle', 100.00, 2)
,(GETDATE(), 'Bicycle', 100.00, 10)
--10 orders for scooters
,(GETDATE()-10 , 'Scooter', 300.00, 5)
,(GETDATE()-9 , 'Scooter', 300.00, 2)
,(GETDATE()-8 , 'Scooter', 300.00, 4)
,(GETDATE()-7 , 'Scooter', 300.00, 1)
,(GETDATE()-6 , 'Scooter', 300.00, 6)
,(GETDATE()-5 , 'Scooter', 300.00, 9)
,(GETDATE()-4 , 'Scooter', 300.00, 10)
,(GETDATE()-3 , 'Scooter', 300.00, 2)
,(GETDATE(), 'Scooter', 300.00, 15)
,(GETDATE(), 'Scooter', 300.00, 13)
--10 orders for lawn mowers
,(GETDATE()-10 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-9 , 'Lawn Mower', 500.00, 2)
,(GETDATE()-8 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-7 , 'Lawn Mower', 500.00, 2)
,(GETDATE()-6 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-5 , 'Lawn Mower', 500.00, 2)
,(GETDATE()-4 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-3 , 'Lawn Mower', 500.00, 1)
,(GETDATE(), 'Lawn Mower', 500.00, 5)
,(GETDATE(), 'Lawn Mower', 500.00, 3)
Lets read the contents of the table dbo.Order_Details:
select * from dbo.Order_details;
Our purpose is to mark the orders to be shipped today based on upto 25% of the pending order value for each product. This is accomplished by the code below:
With CTE_Base (Order_ID, Order_Date, Product_Name, Order_Value, RowNumber, Total_Value_of_Pending_Orders_By_Product, Order_Value_As_Percent_of_Pending_Orders_By_Product)
as
(select Order_ID
,Order_Date
,Product_Name
,Order_Value
,ROW_NUMBER () over(partition by Product_Name order by Product_Name, Order_Date) RowNumber
,SUM(Order_Value) over(partition by Product_Name) Total_Value_of_Pending_Orders_By_Product
,convert(decimal(28, 15), convert(decimal(28, 15), Order_Value) / convert(decimal(28, 15), SUM(Order_Value) over(partition by Product_Name))) Order_Value_As_Percent_of_Pending_Orders_By_Product
from dbo.Order_details with (nolock)
where Ship_It_Today = 0)
--select * from CTE_Base
,CTE_Level1 (Product_Name, RowNumber, CutOff_Value_By_Product)
as
(select a.Product_Name
,a.RowNumber
,(select SUM(b.Order_Value) from CTE_Base b
where b.Product_Name = a.Product_Name
and b.RowNumber <= a.RowNumber) / a.Total_Value_of_Pending_Orders_By_Product
from CTE_Base a)
--select * from CTE_Level1
update a
set a.Order_Value_As_Percent_of_Pending_Orders_By_Product = b.Order_Value_As_Percent_of_Pending_Orders_By_Product
,a.CutOff_Value_By_Product = c.CutOff_Value_By_Product
,a.Ship_It_Today = case
when c.CutOff_Value_By_Product <= 0.26 then 1
else a.Ship_It_Today
end
,a.Shipping_Date = case
when c.CutOff_Value_By_Product <= 0.26 then GETDATE()
else null
end
from dbo.Order_details a
inner join CTE_Base b
on a.Order_ID = b.Order_ID
inner join CTE_Level1 c
on b.Product_Name = c.Product_Name
and b.RowNumber = c.RowNumber
where a.Ship_It_Today = 0
and a.Shipping_Date is null;
Now lets see the orders that need to be shipped today. It may be noted that we have shipped upto 25% of the orders by value for each product today:
select * from dbo.Order_details;
pending order for a given product. For example, if there are pending orders worth $1000 for bicycles today, bicycles worth upto $250 should be shipped today in the order in which orders were placed by the customers. At the same time, orders should be shipped in full and not partially.
I am using just one table for this demo. It is not in the third normal form just to make the explanation simple. So lets create a base table with the relevant sample data. Please note that the code below is compatible with microsoft SQL Server 2008. With slight modifications, it can work in Microsoft SQL Server 2005 as well :
if exists (select * from sys.tables
where Schema_NAME(schema_ID) = 'dbo'
and name = 'Order_details')
begin
drop table dbo.Order_details
end;
create table dbo.Order_details
(Order_ID int identity(1, 1) primary key clustered with (fillfactor = 50, data_compression = page)
,Order_Date smalldatetime not null
,Product_Name varchar(50) not null
,Unit_Price decimal(28,2) not null
,Quantity_Ordered smallint not null
,Order_Value as (Quantity_Ordered * Unit_Price)
,Order_Value_As_Percent_of_Pending_Orders_By_Product decimal(28, 10) null
,CutOff_Value_By_Product decimal(28, 10) null
,Ship_It_Today bit not null default (0)
,Shipping_Date smalldatetime null)
Next, let us populate the table, dbo.Order_Details.
insert into dbo.Order_details (Order_Date, Product_Name, Unit_Price, Quantity_Ordered)
--10 orders for bicycles
values (GETDATE()-10 , 'Bicycle', 100.00, 1)
,(GETDATE()-9 , 'Bicycle', 100.00, 2)
,(GETDATE()-8 , 'Bicycle', 100.00, 3)
,(GETDATE()-7 , 'Bicycle', 100.00, 4)
,(GETDATE()-6 , 'Bicycle', 100.00, 5)
,(GETDATE()-5 , 'Bicycle', 100.00, 6)
,(GETDATE()-4 , 'Bicycle', 100.00, 7)
,(GETDATE()-3 , 'Bicycle', 100.00, 8)
,(GETDATE(), 'Bicycle', 100.00, 2)
,(GETDATE(), 'Bicycle', 100.00, 10)
--10 orders for scooters
,(GETDATE()-10 , 'Scooter', 300.00, 5)
,(GETDATE()-9 , 'Scooter', 300.00, 2)
,(GETDATE()-8 , 'Scooter', 300.00, 4)
,(GETDATE()-7 , 'Scooter', 300.00, 1)
,(GETDATE()-6 , 'Scooter', 300.00, 6)
,(GETDATE()-5 , 'Scooter', 300.00, 9)
,(GETDATE()-4 , 'Scooter', 300.00, 10)
,(GETDATE()-3 , 'Scooter', 300.00, 2)
,(GETDATE(), 'Scooter', 300.00, 15)
,(GETDATE(), 'Scooter', 300.00, 13)
--10 orders for lawn mowers
,(GETDATE()-10 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-9 , 'Lawn Mower', 500.00, 2)
,(GETDATE()-8 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-7 , 'Lawn Mower', 500.00, 2)
,(GETDATE()-6 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-5 , 'Lawn Mower', 500.00, 2)
,(GETDATE()-4 , 'Lawn Mower', 500.00, 1)
,(GETDATE()-3 , 'Lawn Mower', 500.00, 1)
,(GETDATE(), 'Lawn Mower', 500.00, 5)
,(GETDATE(), 'Lawn Mower', 500.00, 3)
Lets read the contents of the table dbo.Order_Details:
select * from dbo.Order_details;
Our purpose is to mark the orders to be shipped today based on upto 25% of the pending order value for each product. This is accomplished by the code below:
With CTE_Base (Order_ID, Order_Date, Product_Name, Order_Value, RowNumber, Total_Value_of_Pending_Orders_By_Product, Order_Value_As_Percent_of_Pending_Orders_By_Product)
as
(select Order_ID
,Order_Date
,Product_Name
,Order_Value
,ROW_NUMBER () over(partition by Product_Name order by Product_Name, Order_Date) RowNumber
,SUM(Order_Value) over(partition by Product_Name) Total_Value_of_Pending_Orders_By_Product
,convert(decimal(28, 15), convert(decimal(28, 15), Order_Value) / convert(decimal(28, 15), SUM(Order_Value) over(partition by Product_Name))) Order_Value_As_Percent_of_Pending_Orders_By_Product
from dbo.Order_details with (nolock)
where Ship_It_Today = 0)
--select * from CTE_Base
,CTE_Level1 (Product_Name, RowNumber, CutOff_Value_By_Product)
as
(select a.Product_Name
,a.RowNumber
,(select SUM(b.Order_Value) from CTE_Base b
where b.Product_Name = a.Product_Name
and b.RowNumber <= a.RowNumber) / a.Total_Value_of_Pending_Orders_By_Product
from CTE_Base a)
--select * from CTE_Level1
update a
set a.Order_Value_As_Percent_of_Pending_Orders_By_Product = b.Order_Value_As_Percent_of_Pending_Orders_By_Product
,a.CutOff_Value_By_Product = c.CutOff_Value_By_Product
,a.Ship_It_Today = case
when c.CutOff_Value_By_Product <= 0.26 then 1
else a.Ship_It_Today
end
,a.Shipping_Date = case
when c.CutOff_Value_By_Product <= 0.26 then GETDATE()
else null
end
from dbo.Order_details a
inner join CTE_Base b
on a.Order_ID = b.Order_ID
inner join CTE_Level1 c
on b.Product_Name = c.Product_Name
and b.RowNumber = c.RowNumber
where a.Ship_It_Today = 0
and a.Shipping_Date is null;
Now lets see the orders that need to be shipped today. It may be noted that we have shipped upto 25% of the orders by value for each product today:
select * from dbo.Order_details;
1 comment:
After getting more than 10000 visitors/day to my website I thought your sqlfinerpoints.blogspot.com website also need unstoppable flow of traffic...
Use this BRAND NEW software and get all the traffic for your website you will ever need ...
= = > > http://get-massive-autopilot-traffic.com
In testing phase it generated 867,981 visitors and $540,340.
Then another $86,299.13 in 90 days to be exact. That's $958.88 a
day!!
And all it took was 10 minutes to set up and run.
But how does it work??
You just configure the system, click the mouse button a few
times, activate the software, copy and paste a few links and
you're done!!
Click the link BELOW as you're about to witness a software that
could be a MAJOR turning point to your success.
= = > > http://get-massive-autopilot-traffic.com
Post a Comment