PAYATHON 2026

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
2027100.00 × 1.02 + 1.00103.00
2028103.00 × 1.02 + 2.00107.06
2029107.06 × 1.02 + 2.00111.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,无法得到完全相同的结果。

备注:内容仅供参考。