thank you for the motivation i finaly did as below;
DECLARE @Orders TABLE
(
DocEntry bigint, DocDate datetime, [Customer_Name] nvarchar(max),Itemcode nvarchar(50), [Order_Number] nvarchar(max)
,Quantity int, OnHand int ,RowNumber int
);
INSERT INTO @Orders
select O.DocEntry, o.DocDate,CardName,r.itemcode, o.NumAtCard [Order_Number], r.Quantity,
OnHand- (select sum(quantity) from rdr1 with (nolock) where itemcode= r.itemcode and linestatus='o' and pickidNo is not null) OnHand
, ROW_NUMBER() over (partition by r.itemcode
order by o.docentry asc)
from ORDR o join RDR1 r on o.DocEntry = r.DocEntry
inner join OITW W with (nolock) on r.ItemCode=W.ItemCode and W.WhsCode=r.WhsCode where
r.ItemCode ='1034356' and o.docstatus='o' and canceled='n' and r.pickidno is null
order by 1 ;
with mother as( --cte produces unused_onhand
select *,
case when (select top 1 OnHand -Quantity from @orders where RowNumber= r.RowNumber-1 and Itemcode=r.Itemcode )
IS NUll
then r.OnHand --- for first row value append onHand
else
(select top 1 OnHand - ( select SUM(quantity ) from @Orders where Itemcode=r.Itemcode and RowNumber < r.RowNumber ) from @orders where RowNumber= r.RowNumber-1 and Itemcode=r.Itemcode )
end Unused_OnHand -- for subsequent onhand, append unused_onhand
from @Orders r
)
select *,
CASE when (CAST( CAST( Unused_OnHand as NUmeric(18,3)) / CAST( Quantity as NUmeric(18,3) ) as NUmeric(18,3)) *100 ) > 100
then CAST (100.00 AS numeric(18,3))
when (CAST( CAST( Unused_OnHand as NUmeric(18,3)) / CAST( Quantity as NUmeric(18,3) ) as NUmeric(18,3)) *100 ) < 0
then 0
else
(CAST( CAST( Unused_OnHand as NUmeric(18,3)) / CAST( Quantity as NUmeric(18,3) ) as NUmeric(18,3)) *100 )
end[Fulfillment%]
from mother
How do I ask a good question?article for more info.