MSSQL ERP 數量均攤

2022-09-21 20:06:12 字數 2915 閱讀 6495

先貼上參考學習帖子。感謝前輩的文摘

以自己的學習結果做了乙個調整,防止有小夥伴看不懂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 訂單使用總...

均攤時間複雜度

均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。對於初學者來說,這兩個概念確實非常容易弄混。我前面說了,大部分情況下,我們並不需要區分最好 最壞 平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊 更加有限。功能 往陣列中插入資料的功能。當陣列滿了之後,也就...

理解均攤時間複雜度

均攤時間複雜度分析,又叫攤還分析 或者叫平攤分析 均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。對於初學者來說,這兩個概念確實非常容易弄混。大部分情況下,我們並不需要區分最好 最壞 平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊 更加有限。我還是借助乙...