从另一个时期的经理那里获得员工

时间:2017-12-11 17:11:42

标签: c# sql-server sql-server-2008

我们有一个像

这样的员工表
Employee ID
Name

EmployeeManager表,如

employeeid
employeeManagerid
intyear
intperiod

因此每个经理都是员工,employeemanagerid是员工表中的forigen键,而且是员工表中的employeeid

员工可以在一年内拥有多名经理 intYear和intPeriod,intPeriod是月份,因此它的值为1-12

我想要实现的目标是,如果一个经理人在一个时期(几个月)内被选中,并且没有经理被分配到接下来的三个时期(月),那么同一个经理 将被分配给那个人,

举个例子

employee table
----------------------------------------------------------------
employeeid   name
1              a
2              b
3              c
4              d
5              e
-------------------------------------------------------------------

EmployeeManager table
----------------------------------------------------------------------
employeeid           employeemanagerid       intyear         intperiod
-----------------------------------------------------------------------
1                           5                   2017            3
1                           4                   2017            4
2                           4                   2017            6
3                           4                   2017            6
------------------------------------------------------------------------

我的查询

select e.name,e.employeeid
from employee e
left join employeemanager em
on e.employeeid = em.employeeid
where
em.employeemanagerid  = @managerid
and em.intyear = @intyear
and em.intperiod <= @intperiod

the values supplied as a parameter are
@managerid = 4
@intyear = 6
@intperiod = 2017

我想要的预期结果是

------------------------------------------------------
name               employeeid               
a                   1
b                   2
c                   3  
------------------------------

员工b,c是直接匹配,但是在第4期中设置了经理 仍然持续到第6期

我应该在查询中更改以获得此结果 参数值从c#发送。

1 个答案:

答案 0 :(得分:0)

问题是您是否过滤掉了不适合特定经理的所有记录,但您仍然希望这些记录会影响结果。你也没有做任何事情来阻止重复,如果你有一个员工从经理4到5到4,它会显示两次。您需要先获取一个查询,确定所需时间段内每行的正确经理是谁,然后从第一个查询中执行主查询。一种方法是:

--This gets all manager records for the period (or before), with a rowno added 
--sorted so that the most recent manager is always number 1
With emData as 
(
    Select employeeid, employeeManagerid, intyear, intperiod
      , ROW_NUMBER() OVER(Partition by employeeid ORDER BY intyear DESC, intperiod DESC) as RowNo
    from employeemanager
    where intyear <= @intyear 
        and intperiod <=@intperiod
)
--This is your original query, changed to use the above as the source
select e.name,e.employeeid
from employee e inner join 
emData em on e.employeeid = em.employeeid
where
em.employeemanagerid  = @managerid
and em.RowNo = 1  --THIS MAKES SURE YOU ARE ONLY LOOKING AT THE MOST RECENT MANAGER