使用if和max值DAX运行总计

时间:2017-09-17 15:20:57

标签: powerbi dax

我想创建一个关于休假的表格,需要一个累计总计。

image

年假栏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中停留。 我需要的结果是:

image

我想,如果价值已经是20,我们可以停止计算吗?并且如果遇到-1则继续计算。或者还有另一种方法可以做到这一点? 看起来如果我使用IF,它只是将可视化设置为20但不将数据设置为20,这就是为什么它被卡在20中因为所有总和都超过20。

1 个答案:

答案 0 :(得分:3)

您最好的选择是,您的源系统要么不允许超过年度上限的年度学分,要么直接向您提供上限年假数量(而不是尝试在Power BI中计算)。

即使源系统没有存储上限年假数量,使用SQL查询比使用Power BI更容易。 (我会为此推荐一个单独的问题。)

我为什么这么说?

在Excel中,根据前一行的值逐行计算运行(或累计)总计。这样可以轻松“覆盖”运行总计,并将该覆盖应用于每个后续行。例如。你可以将运行总数限制在20,并且下面的单元格就好像运行总计为20.底盖下方的单元格不知道运行总计不是20。

在DAX中,每行独立计算运行总计(意味着每行查看当前行日期之前的所有行并计算实际运行总计的内容)。这使得无法覆盖运行总计(例如,通过将其限制为20)并将调整后的运行总进料量放入下一行。下一行总是知道实际运行总量是多少。

没有办法告诉DAX查看先前计算的运行总数并添加它,因为列不能引用自身(如用户5226582所述,它是循环依赖)。与Excel不同,DAX逐列而不是逐个单元地运行计算,因此它不能使用列的输出作为同一列的输入。

脏&amp;不完整的解决方法

肮脏的解决方法取决于年度积分可以被忽视的次数。每次全部或部分年度信用被忽略时,它会调整所有后续单元的运行总计。

例如,在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,并且不会反映在[借方/贷方]栏的总和中。)

Running Total Is Capped = IF([Annual Leave Column2] > 20, 1, 0)

Running Count of Capped =
CALCULATE (
    SUM ( Sheet1[Running Total Is Capped] ),
    ALL ( Sheet1 ),
    FILTER ( Sheet1, Sheet1[Date] <= EARLIER ( Sheet1[Date] ) )
)

Adjusted Running Total =
IF (
    [Running Count of Capped] = 0,
    [Annual Leave Column2],
    20
        + CALCULATE (
            SUM ( Sheet1[Debit/Credit] ),
            ALL ( Sheet1 ),
            FILTER (
                Sheet1,
                Sheet1[Date] <= EARLIER ( Sheet1[Date] )
                    && Sheet1[Running Count of Capped] > 1
            )
        )
)

这个解决方案并没有成功,因为它只能在首次击中上限时起作用。 每次 您都达到了上限,您需要以相同的方式调整运行总计,并使用一组新的计算列调整调整后的运行总计。如果您可以上限20次或50次,您需要重复上述计算列数20或50次。

您无法同时调整所有行的上限,因为第一次调整会影响下次调整的时间。在你的示例数据中,17-Aug-17的真实运行总数为21,这意味着我们希望将其减少到20.但是,因为我们之前已经超过了3次,我们已经削减了3.5天因此,从运行总计中,调整后的运行总数为17.5,因此不需要加盖。

除了您需要的大量计算列之外,该模型也不能很好地适应增加的数据量。 EARLIER函数是迭代的,这意味着它为每一行运行一次计算。行越多,所需的时间越长。使用EARLIER功能优先于&amp;这个快速的&amp; amp;肮脏的解决方法确实会成为性能杀手。我强烈建议在数据到达Power BI之前找到另一种解决方案。

旁注:如果您打算使用EARLIER函数,我建议为每一行编制索引,以保证它们具有唯一的编号,而不是依赖于日期字段作为索引。如果您在同一天有多个信用/借记,则使用日期字段作为索引可能会导致意外结果。