Power Query/Power BI中定期利息计算问题求助
Power Query 解决方法
你的List.Accumulate用法没抓住累计利息的核心——利息是基于滚动的期初余额计算的,不是直接累加interest列。正确的做法是先按季度排序,再用List.Accumulate逐行跟踪余额和累计利息:
- 确保数据按季度顺序排序(比如按日期或季度索引升序)
- 用
List.Accumulate遍历每行,维护「当前期初余额」「累计总利息」两个状态
示例代码:
let // 假设数据源包含列:季度, Contribution, FixedExpBOQ, VariableExpenses, Rate 排序后的数据 = Table.Sort(源, {"季度", Order.Ascending}), 数据列表 = Table.ToRecords(排序后的数据), // 初始化状态:{期初余额, 累计利息},初始期初余额设为0(可根据实际调整) 累计结果 = List.Accumulate( 数据列表, {0, 0}, (状态, 当前行) => let 期初余额 = 状态{0}, // 按你的逻辑计算当期利息 当期利息 = (期初余额 + 当前行[Contribution] - 当前行[FixedExpBOQ]) * 当前行[Rate], 期末余额 = 期初余额 + 当前行[Contribution] - 当前行[FixedExpBOQ] - 当前行[VariableExpenses] + 当期利息, 新累计利息 = 状态{1} + 当期利息 in {期末余额, 新累计利息} ), // 提取最终累计利息 总累计利息 = 累计结果{1}, // 如需给原表添加每季度利息和余额列,可执行以下步骤 逐季度明细 = Table.FromRecords( List.Transform( List.Indexed(数据列表), (indexedRow) => let 行索引 = indexedRow{0}, 当前行 = indexedRow{1}, // 获取上一期期末余额(第一期为初始0) 上期初 = if 行索引 = 0 then 0 else List.FirstN(累计结果, 行索引){行索引-1}{0}, 当期利息 = (上期初 + 当前行[Contribution] - 当前行[FixedExpBOQ]) * 当前行[Rate], 期末余额 = 上期初 + 当前行[Contribution] - 当前行[FixedExpBOQ] - 当前行[VariableExpenses] + 当期利息 in Record.AddFields(currentRow, [当期利息=当期利息, 期末余额=期末余额]) ) ) in 逐季度明细
DAX 解决方法
循环引用是因为BalanceBOQ和Interest Earned(EOQ)互相依赖。要打破循环,得明确期初余额是上一期的期末余额,利息基于期初余额计算,而非互相嵌套。
假设你的表名为账户流水,包含季度列,按以下步骤定义度量值:
- 计算上一期期末余额:
上一期期末余额 = VAR 当前季度 = MAX(账户流水[季度]) VAR 上一季度 = CALCULATE(MAX(账户流水[季度]), FILTER(ALL(账户流水), 账户流水[季度] < 当前季度)) RETURN IF(上一季度 = BLANK(), 0, CALCULATE([期末余额], FILTER(ALL(账户流水), 账户流水[季度] = 上一季度)))
- 定义期初余额(BalanceBOQ):
BalanceBOQ = [上一期期末余额] + SUM(账户流水[Contribution]) - SUM(账户流水[FixedExpBOQ])
- 定义当期利息:
Interest Earned(EOQ) = [BalanceBOQ] * SUM(账户流水[Rate])
- 定义期末余额:
期末余额 = [BalanceBOQ] - SUM(账户流水[Variable Expenses]) + [Interest Earned(EOQ)]
- 计算累计利息:
累计利息 = VAR 当前季度 = MAX(账户流水[季度]) RETURN CALCULATE([Interest Earned(EOQ)], FILTER(ALL(账户流水), 账户流水[季度] <= 当前季度))
内容的提问来源于stack exchange,提问作者eddstyson
相关产品推荐
相关产品推荐

