切换 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 上查找概念)。
我很难理解这个问题。我有一个基于小时数的累计总数,我需要计算回扣。这里的规则是,当总计超过某个金额后,更改返利百分比(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 上查找概念)。