概述
要求 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 中完成,因为它会创建循环依赖。本质上,您提出了一个要求:使用聚合值来确定应该包含在聚合中的内容。
所以我能带给你的就这么多。希望对您有所帮助。