Sql-Server

MSSQL:從前綴編號生成 8 位序列號/條碼編號

  • June 7, 2019

我有一個複雜的任務擺在我面前,我真的可以用你的一些大腦來幫助我。

在我的工作中,我們有一個儲存條碼數字的數據庫。該表包含一個 6 位數字作為 8 位條碼的前綴,我們目前在 Excel 中手動計算條碼的最後 2 位數字。

以下是我們如何手動計算最後 2 位數字的步驟:

條碼前綴範例:

declare @prefix int
set @prefix = 573071

**1)**每個前綴應生成 10 次,其中第 7 位從 0 自動遞增到 9

5730710
5730711
5730712 
5730713
5730714
5730715
5730716
5730717
5730718
5730719

**2)**添加第7位後,我們使用以下公式計算每行的第8位:

  • 首先我們開始計算第一行((5730710)。然後我們開始計算第一個,第三個,第五個,第七個數字並乘以3並將它們加在一起
5730710:
5 x 3     
3 x 3     
7 x 3     
0 x 3 
  • 然後我們取第二、四、六位數字並乘以 1 並將它們加在一起:
7 x 1
0 x 1
1 x 1
  • 我們使用 SUM (45 + 7 = 53) 將兩個結果相加
  • 然後我們將 53入到最接近的 10(僅向上)在這種情況下它必須是 60
DECLARE @num int = 53;
SELECT @num + (10 - (@num % 10)); = 60
  • 在我們四捨五入後,我們用原始值減去四捨五入值:(60 - 53 = 7)

….最後我們從 6 位前綴生成了一個 8 位條碼:結果:57307107

所以我的問題是,我如何通過 sql 做到這一點?

這是我計算第 8 位的方法:

declare @prefix int
set @prefix = 5730710
Select 
(
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
) 
+ 
(10 - ((
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
)%10))

-
(
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
)

但是我仍然想念如何自動生成從 0 到 9 的第 7 位並將其放入上述公式中,最後一旦計算出第 7 位和第 8 位,我需要將它們添加到前綴中以最終看到最終結果8 位條碼。

DECLARE @prefix INT;
SET @prefix = 573071;
WITH 
cte1 AS (SELECT 0 num
        UNION ALL
        SELECT num+1 FROM cte1 WHERE num < 9)
SELECT num, 
@prefix*100+num*10+9-((@prefix/100000+(@prefix/1000)%10+(@prefix/10)%10+num)*3+((@prefix/10000)%10+(@prefix/100)%10+@prefix%10)-1)%10 barcode
FROM cte1;

小提琴

沒有變數聲明的選項:

WITH 
cte0 AS (SELECT 573071 AS prefix),
cte1 AS (SELECT 0 num
        UNION ALL
        SELECT num+1 FROM cte1 WHERE num < 9)
SELECT num, 
prefix*100+num*10+9-((prefix/100000+(prefix/1000)%10+(prefix/10)%10+num)*3+((prefix/10000)%10+(prefix/100)%10+prefix%10)-1)%10 barcode
FROM cte0, cte1;

引用自:https://dba.stackexchange.com/questions/239951