sql - 根据当前时间点的部门对员工历史记录表进行不同计数
问题描述
所以我有一个员工表,其中包含从一开始就所有员工的数据。在数据中,我拥有我应该需要的所有数据。我有员工的开始日期、结束日期(如果没有,则为 null),我有部门的名称,如果部门已更改,则该特定员工有一个新行,具有新的部门值,以及名为“DepValidFrom”的两列和“DepValidto”,以日期格式确定当前员工在该特定部门的时间段。
我的目标是,进入一个矩阵,将所有部门的列表作为行,以年和月作为列,并将当时该部门的员工人数作为值。我拥有所有数据,只是找不到编写 PowerBI Measure 甚至 SQL 查询的确切方法。
所以....我正试图将其引入 Power BI,但我得到的视图不完整。我希望我的数据如下所示:
Department | Jan | Feb | Mar | Apr |
Dep1 | 3 | 5 | 6 | 4 |
Dep2 | 2 | 3 | 2 | 3 |
Dep3 | 1 | 1 | 2 | 3 |
现在我只是使用一个非常简单DISTINCTCOUNT(Emp_Table[EmployeeInitials])
的方法,它给了我一个不完整的视图,因为它只计算特定日期,并且不会将数字保留到总数中,留下一堆空值。
我希望有人能理解我的意思,并且有人可以提供帮助!
谢谢!
解决方案
您可以首先取消透视日期并生成一个查询,该查询给出每个部门和日期的员工人数:
select e.dept, x.dt, sum(cnt) over(partition by dept order by dt) cnt
from employees e
cross apply (values (startdate, 1), (enddate, -1)) as x(dt, cnt)
where dt is not null
然后,您可以进行条件聚合以旋转结果 - 这需要枚举日期:
select dept,
max(case when dt >= '20200101' and dt < '20200201' then cnt else 0 end) cnt_202001,
max(case when dt >= '20200201' and dt < '20200301' then cnt else 0 end) cnt_202002,
...
from (
select e.dept, x.dt, sum(cnt) over(partition by dept order by dt) cnt
from employees e
cross apply (values (startdate, 1), (enddate, -1)) as x(dt, cnt)
where dt is not null
) t
group by dept
当员工在月中发生变动时,该月的两个部门都计算在内。