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
Give us the following:
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:
Now suppose you want to add a new employee to Department No. 2 today. Here is how I would calculate the new EmployeeCode for this employee:
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, max null, , isnulled 0 + 1, 201002000001 .
, , 2011, max, , 201102000001 .