Power BI 中如何计算每年追加固定金额的复利?
可以用 SUMX 累加每笔追加金额在目标年份的复利终值,再加上 2026 年本金的复利终值。结果与逐年计算“上一年余额 × 年增长系数 + 当年追加金额”相同,measure 也无需递归引用自身。
计算规则为:以 2026 年为基准年,2027 年先计息再追加 1.00,2028 年至 2056 年每年先计息再追加 2.00。
为什么原来的公式没有累计追加金额
原公式中的这一项:
AdditionalValue + BaseAmount * POWER(1 + Rate, N)
只计算了本金的复利终值和目标年份当年的追加金额,漏掉了往年的追加金额及其产生的利息。
设本金为 (P),固定年利率为 (r),距 2026 年的年数为 (n),第 (k) 年追加的金额为 (A_k),则:
[ V_n=P(1+r)^n+\sum_{k=1}^{n}A_k(1+r)^{n-k} ]
其中,(A_1=1),从 (A_2) 开始均为 (2)。由于先计息、后追加,当年追加金额对应的指数为 0,从下一年才开始计息。
DAX measure
代码以租金总额为本金,使用前需满足以下条件:
Rents[Current Rent Charge]保存的是 2026 年的基准金额,年份轴不会将其筛选成其他年份的数据。Rents[Percentage Increase]是数值列,当前筛选范围内只有一个利率,且预测期间利率不变。例如,2%存储为0.02。
CPI With Fixed Additions =
VAR SelectedYear =
SELECTEDVALUE('Years'[Year])
VAR BaseYear = 2026
VAR EndYear = 2056
VAR Rate =
SELECTEDVALUE('Rents'[Percentage Increase])
VAR BaseAmount =
SUM('Rents'[Current Rent Charge])
VAR N =
SelectedYear - BaseYear
RETURN
IF(
ISBLANK(SelectedYear)
|| SelectedYear < BaseYear
|| SelectedYear > EndYear
|| ISBLANK(Rate)
|| ISBLANK(BaseAmount),
BLANK(),
VAR GrowthFactor = 1 + Rate
VAR Contributions =
SUMX(
GENERATESERIES(1, N, 1),
VAR ContributionYear = [Value]
VAR AddedAmount =
IF(ContributionYear = 1, 1.00, 2.00)
RETURN
AddedAmount
* POWER(
GrowthFactor,
N - ContributionYear
)
)
RETURN
BaseAmount * POWER(GrowthFactor, N)
+ COALESCE(Contributions, 0)
)
GENERATESERIES(1, N, 1) 生成从第一笔追加到目标年份的序号。SUMX 按每笔追加金额的计息年数计算复利终值,再将这些终值相加。
2026 年的 N = 0,追加金额序列为空,返回的就是基准金额。到 2056 年,N = 30:本金增长 30 年,2027 年追加的 1.00 增长 29 年,2056 年追加的 2.00 不计当年利息。
如果 Percentage Increase 已经是 measure,将利率变量改为:
VAR Rate = [Percentage Increase]
用 100.00 本金、2% 年利率核对
原描述混用了年份和算术结果。按“2027 年追加 1.00,此后每年追加 2.00”的规则,计算结果为:
| 年份 | 计算过程 | 年末金额 |
|---|---|---|
| 2026 | 基准金额 | 100.00 |
| 2027 | 100.00 × 1.02 + 1.00 | 103.00 |
| 2028 | 103.00 × 1.02 + 2.00 | 107.06 |
| 2029 | 107.06 × 1.02 + 2.00 | 111.2012 |
其中,103.00 × 1.02 = 105.06,再加 2.00 得到 107.06。100 × 2% 得到的只是利息 2;包含本金的余额应按 100 × (1 + 2%) 计算。
使用时需要确认的口径
年增长系数
代码使用 1 + Rate。原公式中的 1.01 + Rate 会在 Rate 之外再增加 1 个百分点。例如,Rate = 0.02 时,实际年增长率为 3%。
如果业务要求额外增加这 1 个百分点,可以将代码中的增长系数改回 1.01 + Rate。
本金是总额还是平均值
两段原代码采用了不同的本金口径:第一段使用总额,第二段将总额除以物业编号的非空计数。
要保留第二段的口径,将 BaseAmount 替换为:
VAR BaseAmount =
DIVIDE(
SUM('Rents'[Current Rent Charge]),
COUNT('Rents'[HMS Property Ref No#])
)
COUNT 不会去重。同一物业有多条记录时,需要确认平均值应按记录数还是唯一物业数计算。
完整 measure 会对当前筛选范围内的本金整体追加一次固定金额。如果每套物业都要分别追加,或各物业利率不同,就需要逐套计算后再汇总。
年份筛选与汇总行
如果 'Years' 与租金事实表存在活动关系,年份轴可能会筛掉 2026 年的本金。读取本金和利率时,应先移除预测年份筛选,再指定筛选 2026 年。例如,本金可以写成:
VAR BaseAmount =
CALCULATE(
SUM('Rents'[Current Rent Charge]),
REMOVEFILTERS('Years'),
'Years'[Year] = 2026
)
这样写的前提是,'Years' 的关系能够筛选到对应的基准数据。利率也应按同样的原则读取。
完整代码使用 SELECTEDVALUE,因此,没有唯一年份的总计行会返回空白。改用 MAX 后,总计行会显示当前范围内最后一年的余额,可根据报表需要选择。
金额舍入
公式保留中间计算精度,显示时可将 measure 格式设为两位小数。如果业务要求每年先四舍五入到分,再用舍入后的余额计算下一年,就需要在逐年计算中加入舍入步骤。只对最终结果使用 ROUND,无法得到完全相同的结果。
备注:内容仅供参考。
