Magic!
;with Employees (EmployeeId, HireDate, DepartmentId) as
(
select 1, getdate()-10, 1 union
select 2, getdate()-10, 1 union
select 3, getdate()-8, 2 union
select 4, getdate()-7, 3 union
select 5, getdate()-6, 1
)
select cast(datepart(year, HireDate) as varchar(4)) +
right(replicate( 0 ,4)+cast(DepartmentId as varchar(4)), 4) +
right(replicate( 0 ,4)+cast(row_number() over (partition by DepartmentId,datepart(year, HireDate) order by HireDate asc) as varchar(4)), 4) EmployeeCode
,DepartmentId
,EmployeeId
,convert(varchar(10), HireDate, 120) HireDate
from Employees
将给我们如下:
EmployeeCode DepartmentId EmployeeId HireDate
------------ ------------ ----------- ----------
201000010001 1 1 2010-09-05
201000010002 1 2 2010-09-05
201000010003 1 5 2010-09-09
201000020001 2 3 2010-09-07
201000030001 3 4 2010-09-08
<><>UPDATE:
现在,你想在该部增加一名新雇员。 这里,我是如何计算该雇员的新雇员:
declare @DepartmentId int
set @DepartmentId = 2
select
cast(datepart(year, getdate()) as varchar(4)) +
right(replicate( 0 ,4)+cast(@DepartmentId as varchar(4)), 4) +
right(replicate( 0 ,4)+cast(isnull(max(cast(right(EmployeeCode,4) as smallint)),0) + 1 as varchar(4)), 4) EmployeeCode
from dbo.Employees as e
where DepartmentId = @DepartmentId
and datepart(year, hiredate) = datepart(year, getdate())
<><>UPDATE:
如你能看到,如果你在目前不存在的部门增加一名雇员,即第200号,那么该最高条款将告无效,因为该部门没有雇员,而且该规定被推到0+1,因此,该雇员的“<代码>201002000001<>>>完全正常。
一年过去了,现在又是2011年,最后一项过滤条款将再次取消最高条款,而今后一年,我们将为新部门的一名新雇员提供<>201102000001。