Sql-Server
MSSQL:從前綴編號生成 8 位序列號/條碼編號
我有一個複雜的任務擺在我面前,我真的可以用你的一些大腦來幫助我。
在我的工作中,我們有一個儲存條碼數字的數據庫。該表包含一個 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;