当前位置: 代码迷 >> Sql Server >> 求好手写个SQL语句更新员工编号
  详细解决方案

求好手写个SQL语句更新员工编号

热度:58   发布时间:2016-04-24 10:20:16.0
求高手写个SQL语句更新员工编号
问题描述:
从一个员工表中找出入职时间,提取年(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
  相关解决方案