切换 DAX 回扣基于累计衡量

Switch DAX rebate based on cumulative measure

我很难理解这个问题。我有一个基于小时数的累计总数,我需要计算回扣。这里的规则是,当总计超过某个金额后,更改返利百分比(10%、15%)。无论我如何尝试,我最终都会得到错误的总数或错误的百分比。

这是我失败的方法:

+------------+-------------+------------+
| Day        | BilledHours | LaborPrice |
+------------+-------------+------------+
| 07/01/2018 | 98          | 13000      |
+------------+-------------+------------+
| 07/02/2018 | 89          | 12000      |
+------------+-------------+------------+
| 07/03/2018 | 80          | 11000      |
+------------+-------------+------------+
| 07/04/2018 | 92          | 9000       |
+------------+-------------+------------+
| 07/05/2018 | 52          | 8000       |
+------------+-------------+------------+
| 07/06/2018 | 73          | 7000       |
+------------+-------------+------------+
| 07/07/2018 | 82          | 11000      |
+------------+-------------+------------+


Cumulative Hours = 
CALCULATE(
    SUM(Rebates[BilledHours]),
    FILTER(
        ALL(Rebates[Day]),
        Rebates[Day]<=MAX(Rebates[Day]))
        )

Rebate = 
SUMX(Rebates,
    SWITCH(
        TRUE(),
        [Cumulative Hours]<=400,Rebates[LaborPrice] * 0.10,
        [Cumulative Hours]>=401,Rebates[LaborPrice] * 0.15)
        )

如何获得正确的返利和总额?如果我在求和之前使用 SWITCH,我最终会得到不正确的总数(因为总数总是 > 400)。

首先,按如下方式修改您的累积小时数:

Cumulative Hours =
CALCULATE (
    SUM ( Rebates[BilledHours] ),
    FILTER ( ALL ( Rebates ), Rebates[Day] <= MAX ( Rebates[Day] ) )
)

二、修改返利措施:

Rebate =
SUMX (
    Rebates,
    VAR Cumulative_Hours = [Cumulative Hours]
    RETURN
        SWITCH (
            TRUE (),
            Cumulative_Hours <= 400, Rebates[LaborPrice] * 0.1,
            Cumulative_Hours >= 401, Rebates[LaborPrice] * 0.15
        )
)

结果:

为什么你的公式不起作用:

创建一个简单的测试度量并将其可视化:

   Wrong Rebate Hours = SUMX( Rebates, [Cumulative Hours])

很容易看出 SUMX 中没有 "accumulation" - [Cumulative Hours] 停止累积,因此您的 SWITCH 测试始终 < 400。本质上,SUMX 修改了 [ Cumulative Hours] 通过引入来自 Rebates 的行上下文来衡量(通过 "context transition" - 在 Google 上查找概念)。