T-SQL筆記33_設計一個user defined函數(UDF)來計算最大公因數
由於近期協助撰寫設計
針對特定料號於特定庫別/儲位下所有箱號要進行
庫存異動連動跨DB Server的實體庫存擴充資料表
因此會遇到實體庫存每一箱庫存(先進先出)
最早入庫該箱要依時間排序進行
之後每一箱進行庫存異動迴圈遍歷扣庫存
固定扣除的庫存也就是每一箱庫存 我們取最大公因數
避免每次扣庫存固定周只扣1跑多回合迴圈遍歷次數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | CREATE FUNCTION [dbo].[GET_MultiGCD] (@str VARCHAR (max)) RETURNS INT AS BEGIN DECLARE @tb TABLE (i INT identity, spdata NVARCHAR (max)) DECLARE @strt INT DECLARE @end INT DECLARE @a INT DECLARE @b INT DECLARE @t INT DECLARE @cnt INT DECLARE @ind INT SELECT @strt = 1, @end = CHARINDEX (',', @str) WHILE @strt < LEN (@str) + 1 BEGIN IF @end = 0 SET @end = LEN (@str) + 1 INSERT INTO @tb (spdata) VALUES (SUBSTRING (@str, @strt, @end - @strt)) SET @strt = @end + 1 SET @end = CHARINDEX (',', @str, @strt) END SELECT @cnt = max (i) FROM @tb SELECT @a = convert (INT, spdata) FROM @tb WHERE i = 1 SET @ind = 2 WHILE @ind <= @cnt BEGIN SELECT @b = convert (INT, spdata) FROM @tb WHERE i = @ind WHILE (@b % @a) != 0 BEGIN SET @t = @b % @a SET @b = @a SET @a = @t END SET @ind = @ind + 1 END RETURN @a; END GO |
一個演算歸納推演
一次庫存異動觸發的異動數量: 60
特定某料號 於某庫別 的儲位下假設有三箱
各自分別有
依照先進先出排序
[1] [2] [3]
24 , 30 , 36 => GCD:6 (每次針對每一箱都扣6,若取到1就認命跑完每一圈減項-1操作)
18, 30, 36 =>剩餘異動數量:54
12, 30, 36=>剩餘異動數量:48
6, 30, 36=>剩餘異動數量:42
0, 30,36=>剩餘異動數量:36
0, 24,36=>剩餘異動數量:30
0, 18,36=>剩餘異動數量:24
0, 12,36=>剩餘異動數量:18
0, 6,36=>剩餘異動數量:12
0, 0,36=>剩餘異動數量:6
0, 0,30=>剩餘異動數量:6
留言
張貼留言