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



















留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header