问题描述:
从一个员工表中找出入职时间,提取年(4位)+月(2位)+日(2位)+流水号(3位),进行给员工编号更新,但是可能多个员工的入职时间相同,需要流水号从0开始进行进行加1编号,但是后续已经出现过的不需要进行更新了,例如表中序号为4的就不需要更新了。
例如:
表名:person
员工编号 员工姓名 员工入职时间 序号
PerNub PerName PerTime DocEntry
001 李四 2013-02-21 1
002 王五 2001-06-23 2
003 刘三 2001-06-23 3
19981230001 杨洋 1998-12-30 4
需要更新结果是
员工编号 员工姓名 员工入职时间 序号
PerNub PerName PerTime DocEntry
20130221001 李四 2013-02-21 1
20010623001 王五 2001-06-23 2
20010623002 刘三 2001-06-23 3
19981230001 杨洋 1998-12-30 4
------解决方案--------------------
create table person
(PerNub varchar(20),PerName varchar(10),PerTime varchar(15),DocEntry int)
insert into person
select '001','李四','2013-02-21',1 union all
select '002','王五','2001-06-23',2 union all
select '003','刘三','2001-06-23',3 union all
select '19981230001','杨洋','1998-12-30',4
-- 更新
update a
set a.PerNub=b.newPerNub
from person a
inner join
(select *,
convert(varchar,cast(PerTime as date),112)
+right('000'+rtrim(row_number() over(partition by PerTime order by DocEntry)),3) 'newPerNub'
from person) b on a.DocEntry=b.DocEntry and a.PerNub=b.PerNub
where a.PerNub<>b.newPerNub
-- 结果
select * from person
/*
PerNub PerName PerTime DocEntry
-------------------- ---------- --------------- -----------
20130221001 李四 2013-02-21 1
20010623001 王五 2001-06-23 2
20010623002 刘三 2001-06-23 3
19981230001 杨洋 1998-12-30 4
(4 row(s) affected)
*/
------解决方案--------------------
with cte as
(
select * ,row_number() over(partition by PerTime order by DocEntry) as rn from person
)
update cte set PerNub=Replace(PerTime,'-','')+right((1000+rn),3)
go
select * from person
--PerNub PerName PerTime DocEntry
--20130221001 李四 2013-02-21 1
--20010623001 王五 2001-06-23 2
--20010623002 刘三 2001-06-23 3
--19981230001 杨洋 1998-12-30 4