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

Posted

技术标签:

【中文标题】从另一个时期的经理那里获得员工【英文标题】:Get employees from a manager which is from another period 【发布时间】:2018-05-25 06:31:27 【问题描述】:

我们有一个像这样的员工表

Employee ID
Name

EmployeeManager 表样

employeeid
employeeManagerid
intyear
intperiod

所以每个经理都是员工,employeemanagerid 是员工表中的外来键,是员工表中的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 是直接匹配,但 a 在第 4 期设置了经理 仍在持续到第 6 期

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

【问题讨论】:

【参考方案1】:

问题是您要过滤掉所有不属于特定经理的记录,但您仍然希望这些记录会影响结果。你也没有做任何事情来阻止重复,如果你有一个员工从经理 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

【讨论】:

以上是关于从另一个时期的经理那里获得员工的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的错误:目标丢失。必须从波普尔经理那里获得波普尔的目标,

选择既是经理又在经理手下工作的员工

如何获得具有特定属性的特定孩子..这是我的火力基地

从另一个方法调用的@Transactional 方法没有获得事务

获得表现指标

没有从另一个 Nodejs 服务器获得响应?