高手们 帮我解决个问题
写的详细点 简单点 越好
小弟在此感谢大家了如现在下表字段: tableA
=================
ID
10C74
10C8
10D53
10E12
10E29
10E30
10E7
10E74
10E86
10E9
10F35
10G13
10H17
10H37
10K22
10K42
10M25
10M26
10M42
10M81
10N41
11A67
11B21
11B22
11B32
11C3
....
....
例如:
如果有一个9N1 改成 0909N001
如果有两个 9N1一样 那么 其中一个改成 0909N001-01
如果有三个 9N1一样 那么其中两个改成 0909N001-01 0909N001-02
写的详细点 简单点 越好
小弟在此感谢大家了如现在下表字段: tableA
=================
ID
10C74
10C8
10D53
10E12
10E29
10E30
10E7
10E74
10E86
10E9
10F35
10G13
10H17
10H37
10K22
10K42
10M25
10M26
10M42
10M81
10N41
11A67
11B21
11B22
11B32
11C3
....
....
例如:
如果有一个9N1 改成 0909N001
如果有两个 9N1一样 那么 其中一个改成 0909N001-01
如果有三个 9N1一样 那么其中两个改成 0909N001-01 0909N001-02
求一条SQL语句 OK?
我刚刚学SQL语句
我用的是2000的数据库
insert into tb values('9N1')
insert into tb values('9N1')
insert into tb values('9N1')
insert into tb values('9N2')
insert into tb values('9N2')
insert into tb values('9N3')
goselect id old_id , case when px = 1 then id else cast(id as varchar) + right('-0'+cast(px - 1 as varchar),3) end new_id from
(
select * , px = row_number() over(partition by id order by id) from tb
) tdrop table tb/*
old_id new_id
---------- ---------------------------------
9N1 9N1
9N1 9N1-01
9N1 9N1-02
9N2 9N2
9N2 9N2-01
9N3 9N3(6 行受影响)
*/
insert into tb values('9N1')
insert into tb values('9N1')
insert into tb values('9N1')
insert into tb values('9N2')
insert into tb values('9N2')
insert into tb values('9N3')
goselect id , px = identity(int,1,1) into tmp from tbselect id old_id , case when px = 1 then id else cast(id as varchar) + right('-0'+cast(px - 1 as varchar),3) end new_id from
(
select id , px = (select count(1) from tmp where id = t.id and px < t.px) + 1 from tmp t
) tdrop table tb , tmp/*
old_id new_id
---------- ------------------------------------
9N1 9N1
9N1 9N1-01
9N1 9N1-02
9N2 9N2
9N2 9N2-01
9N3 9N3(所影响的行数为 6 行)*/
--如果有三个 9N1一样 那么其中两个改成......--何谓“一个、两个....”:是相对于某条记录中,看9N1出现的次数,还是,字段中,记录排序后的位置呢?
Thank
不过还有一个问题
如果有一个9N1 就改成 0909N001 这样的形式
10N8 就改成 1010N008
11B21 就改成 1111B021 将字段补齐