我想计算一段时间内各个年龄段的在职员工人数。我在网上找到了一些解决方案,但他们没有考虑到员工的年龄会随着时间的推移而变化并落入不同的年龄段。
我的目标是像这个例子一样的结果:
年龄组 | 2024-01 | 2024-02 | 2024-03 | 2024-04 |
---|---|---|---|---|
21-30 | 15 | 16 | 16 | 15 |
31-40 | 21 | 19 | 18 | 19 |
41-50 | 25 | 27 | 26 | 27 |
51-60 | 10 | 11 | 12 | 13 |
我有桌子: 员工、员工状态、年龄组、日历
表格说明
Table Employee 是员工及其出生日期的列表。 列: 员工 ID、出生日期
Table EmployeeStatus 是带有生效日期的状态变更列表。状态为 0(不活动)或 1(活动),当然一名员工可以多次活动和不活动(例如重新雇用、育儿假......)。 列:员工 ID、状态、生效日期
Table AgeGroup 是我想要跟踪的年龄箱列表,其中包含组中的最小和最大年龄。 列:年龄组、最小值、最大值
Table Calendar 只是一个日历。 列:日期、月份
关系是:
员工[员工ID]-员工状态[员工ID]一对多
日历[日期]-员工状态[生效日期]一对多
AgeGroup 未连接,因为我不知道如何连接。
我有一个测量 HeadCount 来计算特定时间(例如日期、月底)的员工数量:
HeadCount =
VAR LatestAvailableDate =
ADDCOLUMNS(
VALUES('Employee'[EmployeeID]),
"Date",
CALCULATETABLE(
LASTNONBLANK(Calendar[Date], CALCULATE(COUNTROWS(EmployeeStatus))),
DATESBETWEEN (Calendar[Date], BLANK(), MAX(Calendar[Date]))))
VAR LatestAvailableDateLineage =
TREATAS(LatestAvailableDate,
Employee[EmployeeID],
'Calendar'[Date])
VAR Result =
CALCULATE(
SUM(EmployeeStatus[Status]),
LatestAvailableDateLineage)
RETURN
IF(Result = 0, BLANK(), Result)
然后我有一个计算员工年龄的方法:
Age =
AVERAGEX(
'Employee',
INT(
DIVIDE(
DATEDIFF('Employee'[DateOfBirth], MAX('Calendar'[Date]), DAY),
365.25
)
) * [HeadCount]
)
最后根据年龄计算出一个年龄组:
AgeGroup =
CALCULATE(
SWITCH(TRUE(),
[Age] <= 20, "Below"
,[Age] <= 30, "21-30"
,[Age] <= 40, "31-40"
,[Age] <= 50, "41-50"
,[Age] <= 60, "51-60"
,"Above"))
上述措施运行良好,我只是无法对结果进行分组并显示计数。
编辑: 样本数据
员工
员工ID | 出生日期 |
---|---|
001 | 1983-02-01 |
002 | 1983-03-01 |
003 | 1993-04-01 |
员工状态
员工ID | 状态 | 生效日期 |
---|---|---|
001 | 1 | 2023-12-01 |
001 | 0 | 2024-03-01 |
002 | 1 | 2024-01-01 |
003 | 1 | 2024-02-01 |
年龄组
年龄组 | 最低 | 最大 |
---|---|---|
21-30 | 21 | 30 |
31-40 | 31 | 40 |
41-50 | 41 | 50 |
51-60 | 51 | 60 |
结果
年龄组 | 2024-01 | 2024-02 | 2024-03 | 2024-04 |
---|---|---|---|---|
21-30 | 0 | 1 | 1 | 0 |
31-40 | 2 | 1 | 0 | 1 |
41-50 | 0 | 1 | 1 | 1 |
解决办法就是这个措施。 AgeGroup 没有连接到任何表,这让我感到惊讶,它竟然有效。
年龄计数= 计算( COUNTROWS(员工), FILTER(员工, 员工[年龄] <= MAX(AgeGroup[Maximum]) && Employee[Age] >= MIN(年龄组[最小值])))