先貼上參考學習帖子。感謝前輩的文摘
以自己的學習結果做了乙個調整,防止有小夥伴看不懂cte
以銷售訂單為例
行號物料編碼數量1
a001
1002
a001
2003
a001304
b001
2005
b001
280庫存資料
行號物料編碼
庫存數量
1a001
2802
b001
500希望看到的結果
行號物料編碼
數量庫存數量
1a001
100100
2a001
200180
3a001300
4b001
200200
5b002
280300
declare @salorder table
( fmaterialid nvarchar(255),
fqty decimal(18,10))
insert into @salorder values
('a001',100),
('a001',200),
('a001',30),
('b001',200),
('b001',280)
declare @stockqty table
( fmaterialid nvarchar(255),
fqty decimal(18,10))
insert into @stockqty values
('a001',280),
('b001',500)
-- 先把資料拼接在一起
select
row_number() over(order by t.fmaterialid) as fid
,row_number() over(partition by t.fmaterialid order by t.fmaterialid) as frow
,t.fmaterialid '物料id',t.fqty '訂單數量',t1.fqty as '庫存數'
,cast(0 as decimal(18,10)) as '預留需求匯總數'
,cast(0 as decimal(18,10)) as '預留計算結存數'
,cast(0 as decimal(18,10)) as '預留分攤結果'
into #temp
from @salorder t
join @stockqty t1 on t.fmaterialid = t1.fmaterialid
-- 開始處理匯總數
update t
set t.預留需求匯總數 = (select sum(x.訂單數量) from #temp x where x.物料id = t.物料id and x.fid <= t.fid),
t.預留計算結存數 = t.庫存數 - (select sum(x.訂單數量) from #temp x where x.物料id = t.物料id and x.fid <= t.fid)
from #temp t
-- 初步處理分攤結果
update t
set t.預留分攤結果 =
case when t.預留計算結存數 >= 0 then t.訂單數量
when t.預留計算結存數 <0 and abs(t.預留計算結存數) <= t.訂單數量 then t.訂單數量 + t.預留計算結存數
when t.預留計算結存數 < 0 and abs(t.預留計算結存數) > t.訂單數量 then 0 end
from #temp t
-- 最終處理,預留剩餘的需要加上去,也就是當尾行大於0的時候需要處理
update t
set t.預留分攤結果 = t.預留分攤結果 + t.預留計算結存數
from #temp t
where t.預留計算結存數 >= 0 and fid = (select max(fid) from #temp x where t.物料id = x.物料id)
select * from #temp
drop table #temp
fid
frow
物料id
訂單數量
庫存數預留需求匯總數
預留計算結存數
預留分攤結果11
a001
100.0000000000
280.0000000000
100.0000000000
180.0000000000
100.000000000022
a001
200.0000000000
280.0000000000
300.0000000000
-20.0000000000
180.000000000033
a001
30.0000000000
280.0000000000
330.0000000000
-50.0000000000
0.000000000041
b001
200.0000000000
500.0000000000
200.0000000000
300.0000000000
200.000000000052
b001
280.0000000000
500.0000000000
480.0000000000
20.0000000000
300.0000000000
最終的分攤結果與我們希望一致。
ps:測試的時候可以把update一行行注釋來看效果。
訂單優惠均攤演算法
訂單 使用優惠金額 下放 訂單明細 由於小數原因分配不完整商品精度至小數點後兩位 1.商品原價1元 2.總共3件商品 3.合計金額3元 4.使用1張1元優惠券 5.金額等比分配到每一件商品由於小數精度問題導致金額分配不完全訂單總金額為 a 訂單明細金額為 b1,b2,b3.a b1 b2 訂單使用總...
均攤時間複雜度
均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。對於初學者來說,這兩個概念確實非常容易弄混。我前面說了,大部分情況下,我們並不需要區分最好 最壞 平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊 更加有限。功能 往陣列中插入資料的功能。當陣列滿了之後,也就...
理解均攤時間複雜度
均攤時間複雜度分析,又叫攤還分析 或者叫平攤分析 均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。對於初學者來說,這兩個概念確實非常容易弄混。大部分情況下,我們並不需要區分最好 最壞 平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊 更加有限。我還是借助乙...