总览
要求PowerBI这样做是具有挑战性的事情,因此可能很难找到整洁的方法。
最大的问题是PowerBI的数据模型不支持运行提示的概念-至少不支持我们在Excel中的方式。在Excel中,一列可以引用在同一列的“上一行”中出现的值,然后通过在另一列中列出的“每日更改”进行调整。
PowerBI只能通过将行的某些子集上的所有每日更改加起来来模仿这一点。我们在当前行中获取日期值,并创建一个过滤表,该表中的所有日期均小于当前行的日期,然后汇总该子集中的所有每日更改。这可能看起来是微妙的差异,但意义非凡:
这意味着无法“替代”我们的总运行量。唯一正在执行的数学运算是在包含每日变化的列上进行的-包含“运行总计”的列仅是一个结果-永远不会在任何后续行的计算中使用它。
我们必须放弃“重置”的概念,而应该想象制作一个包含“调整”值的列。我们的调整项将是一个可以包含的值,以便在满足上述条件时,每日余额和调整项的总和将为1。
如果我们看一下OP给定的计算的运行,我们会发现在“工作”日之前的“非工作”日的运行总价值为我们提供了所需的金额,如果将其取反,该金额将总计为零,使下一个工作日的运行总计增加一。这是我们期望的行为(稍后将描述一个问题)。
结果
Most Recent Date Prior to Work =
CALCULATE(
Max(Leave[Date]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Date]) -1 && Leave[Type] <> "Working" && Earlier(Leave[Type]) = "Working"
))
它有助于了解行和过滤器上下文之间的差异,以及EARLIER如何操作以遵循此计算。在这种情况下,您可以将“ EARLIER”理解为“此引用指向当前行中的值”,否则引用指向由“ ALLEXCEPT(Leave,Leave [Id])”返回的整个表。方式,我们找到当前行的类型为“工作”且前一天的行为其他类型的地方。
Most Recent Date Prior to Work Complete =
CALCULATE(
Max(Leave[Most Recent Date Prior to Work]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] <= EARLIER(Leave[Date])
))
该计算模仿了“填充”类型的操作。它说:“当查看日期在此行的日期之前的所有行时,请返回“上班前最近的日期”中的最大值。
Daily Balance Adjustment =
CALCULATE(
SUM(Leave[Running Daily Balance]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Most Recent Date Prior to Work Complete])
))
现在,每一行都有一个字段,说明要去哪里找到要用作我们的调整的每日余额,我们可以从表中查找它。
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
最后,我们将调整应用于我们的总计以得出最终结果。
问题
此方法无法解决除非每日运行余额低于零,否则不应重置计数。以前我被证明是错误的,但是我想说这不能仅在DAX中完成,因为它会产生循环依赖。本质上,您有一个要求:使用合计值来确定应包含在合计中的内容。
这样我就可以带你了。希望能帮助到你。