我想创建一个关于休假的表格,需要一个累积总计 .
年假栏2 DAX是
Annual Leave Column2 =
CALCULATE (
SUM (Sheet1[Debit/Credit]),
ALL ( Sheet1 ),
FILTER(Sheet1, SUM(Sheet1[Debit/Credit])>20), Sheet1[Date] <= EARLIER ( Sheet1[Date] )
)
对于第3列是
column 3 = IF( Sheet1[Annual Leave Column2]>20, 20, Sheet1[Annual Leave Column2] )
但结果是它已经20并且在下一个日期有一个-1它仍将计数20并且在20中停留 . 我需要的结果是:
我想,如果 Value 已经是20,我们可以停止计算吗?并且如果遇到-1则继续计算 . 或者还有另一种方法可以做到这一点?看起来如果我使用IF,它只是将可视化设为20但不将数据设置为20,这就是为什么它被卡在20中因为所有总和都超过20 .
1 回答
您最好的选择是您的源系统要么不允许超过年度上限的年度信用额度,要么直接向您提供上限年假金额(而不是尝试在Power BI中计算它) .
即使源系统没有存储上限年假数量,使用SQL在查询中计算它可能比使用Power BI更容易 . (我会为此推荐一个单独的问题 . )
Why Do I Say This?
在Excel中,根据前一行的值逐行计算运行(或累计)总计 . 这样可以轻松“覆盖”运行总计,并将该覆盖应用于每个后续行 . 例如 . 你可以将运行总数限制在20,并且下面的单元格就好像运行总计为20.底盖下面的单元格不知道运行总计不是20 .
在DAX中,运行总计在每一行上独立计算(意味着每行查看当前行日期之前的所有行并计算实际运行总计的内容) . 这使得无法覆盖运行总计(例如,通过将其限制为20)并将调整后的运行总进料量放入下一行 . 下一行总是知道实际运行总量是多少 .
没有办法告诉DAX查看先前计算的运行总数并添加到它,因为列不能引用自身(如提到的user5226582,它是循环依赖) . 与Excel不同,DAX逐列而不是逐个单元地运行计算,因此它不能使用列的输出作为同一列的输入 .
Dirty & Incomplete Workaround
肮脏的解决方法取决于年度积分可以被忽视的次数 . 每次全部或部分年度信用被忽略时,它会调整所有后续单元格的运行总计 .
例如,在5月1日 - 17日,真正的跑步总数是20.5,但你扔掉了0.5 . 这意味着所有未来的行都是基于5月1日 - 17日的运行总计20,而不是20.5 .
您当然可以创建一个计算列,用于标识第一次运行总计上限(2017年5月1日) . 然后,您将计算使用之前计算的运行总计的调整后的运行总计,但是在1月5日之后,忽略先前的运行总计,而是将1个月的[借方/贷方]列相加17加20 . (加20,因为我们知道运行总数在1月5日 - 17日为20,并且不会反映在[借方/贷方]栏的总和中 . )
这个解决方案并没有成功,因为它只能在第一次达到上限时起作用 . Each time 你打了上限,你_1174333_ ll需要上面的计算列重复20或50次 .
您无法同时调整所有行的上限,因为第一次调整会影响下一次调整的时间 . 在你的示例数据中,17-Aug-17的真实运行总数为21,这意味着我们希望将其减少到20.但是,因为我们之前已经超过了3次,我们已经削减了3.5天因此,从运行总计中,调整后的运行总数为17.5,因此不需要加盖 .
除了您需要的大量计算列之外,该模型也不能很好地适应增加的数据量 . EARLIER函数是迭代的,这意味着它为每一行运行一次计算 . 行越多,所需的时间越长 . 一遍又一遍地使用EARLIER功能,因为这种快速和肮脏的解决方法确实会成为性能杀手 . 我强烈建议找到另一种解决方案,理想情况是在数据到达Power BI之前 .
旁注:如果您建议对每一行编制索引,以保证它们具有唯一编号,而不是依赖日期字段作为索引 . 如果您有相同的多个信用/借方,则使用日期字段作为索引可能会导致意外结果日期 .