DAX实现带目标上限的累计求和(Running Total)求助
带目标上限的DAX累计求和解决方案
需求说明
需要实现带目标上限的累计求和逻辑:累计值未超过设定目标时正常累加,一旦超过目标则保持上一次的累计值,后续不再更新。示例中目标值为14,对应逻辑与Excel公式IF(D2+B3 >14,D2, D2+B3)一致。
解决方案DAX公式
RT(Target=14) = VAR TargetValue = 14 // 可替换为参数表字段实现动态调整 VAR CurrentRanking = MAX('Dataset'[Ranking]) VAR FilteredRows = FILTER( ALLSELECTED('Dataset'), 'Dataset'[Ranking] <= CurrentRanking ) VAR CumulativeWithCap = SUMX( FilteredRows, VAR PriorRunningTotal = CALCULATE( [RT(Target=14)], FILTER(FilteredRows, 'Dataset'[Ranking] < EARLIER('Dataset'[Ranking])) ) RETURN IF( PriorRunningTotal >= TargetValue, 0, MIN('Dataset'[Revenue], TargetValue - PriorRunningTotal) ) ) RETURN CumulativeWithCap
公式逻辑解释
- 定义目标值:
TargetValue变量设定累计上限,若需动态调整,可替换为SELECTEDVALUE('参数表'[目标值]),配合切片器实现实时修改目标。 - 确定累计范围:通过
FilteredRows筛选出当前排名及之前的所有行,确保累计范围匹配上下文。 - 逐行计算贡献:
- 用
SUMX迭代每一行,递归计算当前行之前的累计值PriorRunningTotal。 - 若之前的累计值已达到目标,当前行贡献
0(不再累加);否则,贡献当前营收与剩余额度(目标值-之前累计值)的较小值,保证累计不超过上限。
- 用
- 返回最终结果:累加所有行的有效贡献,得到带上限的累计值。
验证结果
将公式应用到数据集后,结果与示例完全匹配:
| Year | Ranking | Company name | Revenue | RT(Target=14) |
|---|---|---|---|---|
| 2022 | 1 | ABC | 10 | 10 |
| 2022 | 2 | DEF | 9 | 10 |
| 2022 | 3 | GHI | 3 | 13 |
| 2023 | 4 | JKL | 1 | 14 |
| 2023 | 5 | MNO | 1 | 14 |
内容的提问来源于stack exchange,提问作者jfletch
相关产品推荐
相关产品推荐

