Power BI带年度固定追加额的复利计算DAX度量值问题求助
复利计算需求与DAX解决方案
业务需求
计算2026年至2056年的复利,需满足以下规则:
- 初始计算基数为2026年的租金总额(
SUM(Rents[Current Rent Charge])) - 从2027年起每年追加固定金额:2027年追加1.00,2028年及之后每年追加2.00
- 追加的金额需计入下一年的复利计算基数,即每年的计算基数 = 上一年的复利结果 + 当年追加金额
现有基础度量值
仅实现了初始金额的复利计算,未包含追加金额的滚动复利:
CPI = VAR selectedyear = MAX(Years[Year]) VAR currentyear = 2026 VAR rate = Rents[Percentage Increase] RETURN SUM(Rents[Current Rent Charge]) * POWER((1.01 + rate),selectedyear-currentyear)
尝试的改进度量值(未达预期)
该代码仅在初始金额基础上追加固定值后计算复利,未实现滚动累积逻辑:
TEST CPI + 1% Bedrooms = VAR selectedyear = MAX(Years[Year]) VAR currentyear = 2026 // this might need to be calculated VAR rate = Rents[Percentage Increase] VAR AdditionalValue = if(selectedyear-currentyear = 1,1.00,IF(selectedyear-currentyear > 1,2.00,0.00)) VAR Calc = AdditionalValue +SUM(Rents[Current Rent Charge])/COUNT(Rents[HMS Property Ref No#]) * POWER((1.01 + rate),selectedyear-currentyear) RETURN Calc
核心问题
当前改进代码未基于**上一年度的最终计算结果(含追加金额)**进行复利滚动计算,而是始终以2026年的初始金额为基数,导致结果不符合业务要求。
解决方案:滚动复利迭代计算
要实现逐年滚动的复利+追加逻辑,需通过迭代计算逐年累积每一年的期末值。以下提供两种可行的DAX实现方案:
方案1:时间价值拆分法
将初始金额和每一年的追加金额分别计算到目标年份的复利,再求和,逻辑清晰且计算高效:
CPI with Annual Additions = VAR SelectedYear = MAX(Years[Year]) VAR Rate = Rents[Percentage Increase] VAR InitialRent = SUM(Rents[Current Rent Charge]) -- 生成2026到选中年份的连续年份序列 VAR YearRange = GENERATESERIES(2026, SelectedYear) -- 迭代计算每一笔追加金额的复利价值 VAR CumulativeAdditions = SUMX( YearRange, VAR CurrentYr = [Value] VAR YearsElapsed = CurrentYr - 2026 -- 确定当年的追加金额 VAR AnnualAdd = SWITCH( TRUE(), YearsElapsed = 0, 0, -- 2026年无追加 YearsElapsed = 1, 1.00, -- 2027年追加1.00 2.00 -- 2028年及以后追加2.00 ) -- 计算该笔追加金额到目标年份的复利系数 VAR CompoundMultiplier = POWER(1.01 + Rate, SelectedYear - CurrentYr) RETURN AnnualAdd * CompoundMultiplier ) -- 初始租金的复利 + 所有追加金额的复利总和 RETURN InitialRent * POWER(1.01 + Rate, SelectedYear - 2026) + CumulativeAdditions
方案2:逐年滚动迭代法
直接模拟每年的计算过程,每一年的期末值基于上一年的结果复利后加上当年追加金额,更贴合业务逻辑的直观理解:
CPI with Rolling Compound = VAR SelectedYear = MAX(Years[Year]) VAR Rate = Rents[Percentage Increase] VAR InitialValue = SUM(Rents[Current Rent Charge]) -- 逐年迭代计算期末值 VAR RollingCalculations = GENERATE( GENERATESERIES(2026, SelectedYear), VAR CurrentYr = [Value] VAR PreviousYr = CurrentYr - 1 -- 获取上一年的期末值 VAR PreviousEndValue = IF( CurrentYr = 2026, InitialValue, CALCULATE(MAX([End Value]), FILTER(ALL(Years[Year]), Years[Year] = PreviousYr)) ) -- 确定当年的追加金额 VAR AnnualAddition = IF(CurrentYr = 2027, 1.00, IF(CurrentYr > 2027, 2.00, 0)) -- 计算当年期末值 VAR CurrentEndValue = PreviousEndValue * (1.01 + Rate) + AnnualAddition RETURN ROW("Year", CurrentYr, "End Value", CurrentEndValue) ) -- 返回选中年份的期末值 RETURN MAXX(RollingCalculations, [End Value])
注意事项
- 确保
Years表包含2026至2056的所有年份,且与模型中的其他表(如Rents)建立正确的日期关联。 - 若
Rents[Percentage Increase]是按维度(如物业、区域)区分的,需调整计算逻辑确保利率与对应维度匹配。
内容的提问来源于stack exchange,提问作者mcclay R
相关产品推荐
相关产品推荐

