从另一个时期的经理那里获得员工
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
【讨论】:
以上是关于从另一个时期的经理那里获得员工的主要内容,如果未能解决你的问题,请参考以下文章
未捕获的错误:目标丢失。必须从波普尔经理那里获得波普尔的目标,