2016-08-02 66 views
1

任何人都可以幫助我嗎?在SQL Server 2008中生成Alpha數字系列

我想生成一個字母數字系列,如A.1, A.2, A.3, A.4, B.1, B.2,如果我添加新行,它應該自動增加。

我有一個列A和B,它將如下所示。

A B 
----- 
1 A 
1 A 
1 A 
1 A 
2 B 
2 B 
3 C 
3 C 
3 C 

的結果必須是類似於下面:

A B C 
----------- 
1 A A.1 
1 A A.2 
1 A A.3 
1 A A.4 
2 B B.1 
2 B B.2 
3 C C.1 
3 C C.2 
3 C C.3 
+1

使用「身份」列。不要構造人造鑰匙。 –

+0

感謝您的建議。但列A是標識列。你給我查詢的簡單例子 – Perumal

+3

身份重複值?真? – Serg

回答

0

下面的查詢可以返回您預期的結果。

SELECT A, B, B + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY B ORDER BY A) AS VARCHAR) AS C 
FROM TableName 

生成Alpha數值序列很困難。在計算列中使用ROW_NUMBER()也是不可能的。因此,對於你的情況view是達到您的期望是正確的選擇:

CREATE VIEW dbo.vw_MyAlphaNumbericOrder AS 
SELECT A, B, B + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY B ORDER BY A) AS VARCHAR) AS C 
FROM dbo.TableName 

所以,當你永遠都插入一個新的記錄,然後SELECT * FROM dbo.vw_MyAlphaNumbericOrder將與字母數字系列爲C列返回。

樣品執行與給定的樣本數據:

DECLARE @TestTable TABLE (A INT, B VARCHAR (2)); 

INSERT INTO @TestTable (A, B) VALUES 
(1, 'A'), 
(1, 'A'), 
(1, 'A'), 
(1, 'A'), 
(2, 'B'), 
(2, 'B'), 
(3, 'C'), 
(3, 'C'), 
(3, 'C'); 

SELECT A, B, B + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY B ORDER BY A) AS VARCHAR) AS C 
FROM @TestTable 
0

我們可以通過下面的語句實現這一點:

Select A,B,concat(B,'.',cast(row_number() over(partition by B order by B) as char(32))) as C 

1.row_number()以上(分區的) - 將產生新的行沒有。在列B的每個類別中。 2.Cast - 將數值更改爲字符值,其中32指定字段可容納的數據的長度 3. Concat--將連接所需的列以創建字母數字字符串

+1

儘管此代碼可能有助於解決問題,但提供 有關_why_和/或_how_的其他上下文,則回答該問題將顯着提高其長期值 。請[編輯]你的答案,添加一些解釋。 –