2013-05-21 42 views
0
MyField  Description 
-------  ----------- 
A001  Alcantara 
A002  Apacible 
      Arctic 
      Arkansas 

B001  Backdoor 
      Ballpen 
      Brother 
     ..and so on 

在上面的記錄,如何查詢(在一個查詢越好)在T-SQL來更新有像這樣的輸出:T-SQL - 如何更新這些記錄

MyField  Description 
-------  ----------- 
A001  Alcantara 
A002  Apacible 
A003  Arctic 
A004  Arkansas 

B001  Backdoor 
B002  Ballpen 
B003  Brother 

謝謝提前!

+0

你問一個'INSERT'或'UPDAATE'? –

+0

您是否正在嘗試使用描述的第一個字符更新MyField,並且從相同類型的最後一個值開始逐行編號? –

+0

你爲什麼需要這個?除非它是隻讀表,否則這些數字在更新/刪除/插入後將不會保持順序。你還保證每個首字母不超過999行? –

回答

1

試試這個:

;WITH CTE as 
(
select myfield,description,ROW_NUMBER() over (partition by left([Description],1) order by [Description]) as rn 
from Table1 
) 

UPDATE CTE 
SET Myfield=left(description,1) +CASE WHEN rn <= 9 then '00' else '0' end+cast(rn as varchar(3)) from CTE 
+0

爲什麼要按(選擇0)?排序?看起來他們想要按字母順序排列。 –

+0

好的,更新了查詢 – AnandPhadke

+0

首先,感謝Anand Phadke格式化我的問題。我不知道如何去做。對此,ROW_NUMBER是不可能的。我在MyField上放置了3條記錄來了​​解輸出。記錄的第一個字符基於說明字段的第一個字母。 –

0

它也可以通過一個子查詢完成。只是一種替代方法。

UPDATE Table1 SET MyField = SortByDesc.ID 
FROM 
Table1 AS Original 
INNER JOIN (SELECT Description, 
      LEFT(Description,1)+ 
      RIGHT(REPLICATE('0', 3) + CAST((ROW_NUMBER() OVER (PARTITION BY LEFT(Description, 1) ORDER BY [Description])) AS NVARCHAR), 3) AS ID 
      FROM Table1) AS SortByDesc ON Original.Description = SortByDesc.Description 

我試圖在SQL小提琴:http://sqlfiddle.com/#!3/db079/26/0