我有一个带有DisplayName
列的表AoObject。名称中包含Joe Smith
,John Smith
,Jane Smith
等值。这会持续数千条记录。
我想更新表,以便从记录一开始直到最后一条记录,DisplayName的值就是这样。 Joe Smith = Customer1,John Smith = Customer2,Jane Smith = Customer3 ...依此类推,直到所有名称列依次说出Customer附加了一个数字而不是该列的当前值。
这是SQL Server 2012
***以下示例不起作用,我已经修改了我的问题。我没有提供足够的细节。该表称为Aoobject。需要更改的字段实际上称为DisplayName。我需要使用以下内容过滤结果集。
Where ObjectDescription in ('Portfolio Description', 'Portfolio Group Description')
答案 0 :(得分:3)
这似乎是一个坏主意 - "客户编号"应该放在一个单独的栏目中。它不是名称的一部分。但是,这很容易做到:
with toupdate as (
select t.*, row_number() over (order by recordnum) as seqnum
from table t
)
update toupdate
set fullname = fullname + ' Customer' + cast(seqnum as varchar(255));
我假设你有一些记录编号(recordnum
),因为问题是"记录一到最后一条记录"。
编辑:
如果您希望名称是唯一的,则只为重复的名称附加一个数字。
with toupdate as (
select t.*,
row_number() over (partition by fullname order by recordnum) as fn_seqnum,
count(*) over (partition by fullname) as fn_cnt
from table t
)
update toupdate
set fullname = fullname + ':' + cast(fn_seqnum as varchar(255));
where fn_cnt > 1;
仅在需要时附加唯一编号(对于具有重复项的全名)。并且,它保持数字的基数尽可能低,因此只有一个数字应该足够后缀。
答案 1 :(得分:1)
这样的事情会做。 希望客户名称是唯一的。
;WITH cte_emp AS
(
SELECT CustomerName , ROW_NUMBER() over (order by CustomerName) slno
FROM Customer
)
UPDATE t SET CustomerName = 'Customer ' + cast(slno as varchar)
FROM Customer t
INNER JOIN cte_emp c ON t.CustomerName = c.CustomerName