我需要计算人数,同时保持与事实表相关的维度可细分。考虑到我的表和模型的本质,我需要做的是在维度类型2缓慢变化的时间点上进行计算。
我设法使用KEEPFITLERS函数使其工作,但我需要一个更具扩展性的函数,不需要我列出要分割的所有尺寸。
这是我的PowerBI文件,其中包含示例数据:https://gofile.io/d/smS2Hr
这是我的模型的简化草图(图像):https://ibb.co/fQYpsdx
背景:
我要计算的第一个度量是期初员工人数(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函数,该度量无法按任何维度细分,即薪资类别和就业状况(相同的数字会重复)。
结果:
因此,我使用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
此公式的问题在于,我必须在DAX公式中列出要分割的所有维度(例如PayClass,employmentStatus)。这不是很可扩展。
我做了一些REMOVEFILTERS的实验,但是现在看来它不适用于DirectQuery,因此无法解决我的生产问题。链接:
https://docs.microsoft.com/en-us/dax/removefilters-function-dax
问题: 我该如何使用KEEPFILTERS的替代方法来编写此度量,而不必列出要分割的每个维度?
谢谢!
答案 0 :(得分:0)
我刚刚设法解决了我的问题。我将两个关系都与“日期”表设为“非活动”。这样,我可以删除DAX公式中的“ ALL”函数,现在它不仅可以计算正确的值,而且还可以很好地切片。我将不得不使用USERELATIONSHIP函数来计算更复杂的量度,但是在大多数情况下,此简单的解决方案就像一个魅力。
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