按维度划分的HR员工人数-缓慢更改维度

时间:2020-09-09 18:56:26

标签: powerbi dax

我需要计算人数,同时保持与事实表相关的维度可细分。考虑到我的表和模型的本质,我需要做的是在维度类型2缓慢变化的时间点上进行计算。

我设法使用KEEPFITLERS函数使其工作,但我需要一个更具扩展性的函数,不需要我列出要分割的所有尺寸。

这是我的PowerBI文件,其中包含示例数据:https://gofile.io/d/smS2Hr

这是我的模型的简化草图(图像):https://ibb.co/fQYpsdx

Model

背景

我要计算的第一个度量是期初员工人数(Employees SoP)。如果最终用户在2020年1月的整个月中选择PowerBI,则期间的开始日期是2020年1月1日。因此,2020年1月的“雇员SoP”将给出2020年1月1日的雇员人数。

以下公式为员工SoP计算正确的值:

Employees SoP =
VAR MinDate = MIN ( 'Date'[Date]) //Mininum date selected by end-user in PowerBI
VAR Result =
CALCULATE (
DISTINCTCOUNT(Fact[EmployeeId]),
FILTER(ALL('Fact'), 'Fact'[EffectiveStartDate] <= MinDate
&& IF(ISBLANK('Fact'[EffectiveEndDate]), date(2050,1,1), Fact[EffectiveEndDate]) > MinDate
))
RETURN
Result

上述公式的问题在于,由于具有ALL函数,该度量无法按任何维度细分,即薪资类别和就业状况(相同的数字会重复)。

结果:

Employees SoP

因此,我使用KEEPFILTERS创建了另一种方法,并且效果很好。

Employees SoP KEEPFITLERS =
VAR MinDate = MIN ( 'Date'[Date]) //Mininum date selected by end-user in PowerBI
VAR Result =
CALCULATE (
DISTINCTCOUNT(Fact[EmployeeId]),
FILTER(ALL('Fact'), 'Fact'[EffectiveStartDate] <= MinDate
&& IF(ISBLANK('Fact'[EffectiveEndDate]), date(2050,1,1), Fact[EffectiveEndDate]) > MinDate
), KEEPFILTERS(PayClass), KEEPFILTERS(EmploymentStatus))
RETURN
Result

Employees SoP KEEPFILTERS

此公式的问题在于,我必须在DAX公式中列出要分割的所有维度(例如PayClass,employmentStatus)。这不是很可扩展。

我做了一些REMOVEFILTERS的实验,但是现在看来它不适用于DirectQuery,因此无法解决我的生产问题。链接:

https://docs.microsoft.com/en-us/dax/removefilters-function-dax

问题: 我该如何使用KEEPFILTERS的替代方法来编写此度量,而不必列出要分割的每个维度?

谢谢!

1 个答案:

答案 0 :(得分:0)

我刚刚设法解决了我的问题。我将两个关系都与“日期”表设为“非活动”。这样,我可以删除DAX公式中的“ ALL”函数,现在它不仅可以计算正确的值,而且还可以很好地切片。我将不得不使用USERELATIONSHIP函数来计算更复杂的量度,但是在大多数情况下,此简单的解决方案就像一个魅力。

enter image description here

Employees SoP without ALL = 
VAR MinDate = MIN ( 'Date'[Date]) //Mininum date selected by end-user in PowerBI
VAR Result =
CALCULATE (
DISTINCTCOUNT(Fact[EmployeeId]),
FILTER('Fact', 'Fact'[EffectiveStartDate] <= MinDate
            && IF(ISBLANK('Fact'[EffectiveEndDate]), date(2050,1,1), Fact[EffectiveEndDate]) > MinDate
            ))
RETURN
Result