PowerBI计算非连续日期月度变动及DAX报错问题求助
需求与问题说明
我有如下数据表格:
| Carteira | 30/11/23 | 29/12/23 |
|---|---|---|
| Juros I | ||
| Pós-f | 1569 | 1717 |
| Pré-f | 952 | 925 |
| Risco C | ||
| Global | 1196 | 1014 |
我的需求是添加第三列,计算不同日期数值间的变动。但实际数据中日期是同一列(比如DATAREF列),且需要计算非连续日期的月度变动(例如取11月30日与12月29日的数据计算变动,期间还有12月21日的其他数据)。
我尝试了相关方案,写了如下DAX代码:
column_calculated = CALCULATE( SUM(DRM[VL_MTM_Ativo])- SUM(DRM[VL_MTM_Passivo]), ALL('DRM'), 'DRM'[DATAREF] <= EARLIER('DRM'[DATAREF] ) )
但收到报错:
EARLIER/EARLIEST references a previous row context that does not exist
我确认DRM[DATAREF]是常规日期列,使用MAX等普通函数时没有报错。请问有没有可视化工具、DAX或Power Query函数可以解决这个问题?
解决方案一:Power Query(数据预处理)
如果你的数据结构是每行对应Carteira+DATAREF+数值的形式,用Power Query预处理更直观:
- 按
Carteira分组,每个分组内按日期排序 - 为每行匹配对应分组的上月最后有效日期的净值
- 计算当前净值与上月净值的差值
示例M代码(需根据实际列名调整):
let 源 = 你的数据源, 按Carteira分组 = Table.Group(源, {"Carteira"}, {{"所有行", each _, type table [Carteira=text, DATAREF=date, VL_MTM_Ativo=number, VL_MTM_Passivo=number]}}), 添加变动列 = Table.TransformColumns(按Carteira分组, {{"所有行", (tbl) => let 排序日期 = Table.Sort(tbl, {{"DATAREF", Order.Ascending}}), 添加上月数值 = Table.AddColumn(排序日期, "上月数值", (row) => let 当前年月 = #date(Date.Year(row[DATAREF]), Date.Month(row[DATAREF]), 1), 上月年月 = Date.AddMonths(currentMonth, -1), 上月数据 = Table.SelectRows(排序日期, each Date.Year([DATAREF]) = Date.Year(上月年月) and Date.Month([DATAREF]) = Date.Month(上月年月)), 上月最后净值 = if Table.RowCount(上月数据) > 0 then List.Last(上月数据[VL_MTM_Ativo]) - List.Last(上月数据[VL_MTM_Passivo]) else null in 上月最后净值 ), 计算变动 = Table.AddColumn(添加上月数值, "月度变动", each ( [VL_MTM_Ativo] - [VL_MTM_Passivo] ) - [上月数值] ) in 计算变动 }}), 展开所有行 = Table.ExpandTableColumn(添加变动列, "所有行", {"DATAREF", "VL_MTM_Ativo", "VL_MTM_Passivo", "上月数值", "月度变动"}) in 展开所有行
解决方案二:DAX计算列(模型内直接计算)
报错原因
你之前的代码中,ALL('DRM')清除了所有行上下文,导致EARLIER('DRM'[DATAREF])找不到对应的行上下文值,因此报错。需要保留Carteira的筛选上下文来定位对应分组的上月数据。
实现代码
前提:创建日期表
先建立一个日期表并标记为"日期表",关联到DRM表的DATAREF列,方便使用时间智能函数。
计算列代码
月度变动 = VAR 当前净值 = SUM(DRM[VL_MTM_Ativo]) - SUM(DRM[VL_MTM_Passivo]) VAR 上月月末 = EOMONTH(DRM[DATAREF], -1) VAR 上月最后有效日期 = CALCULATE( LASTDATE(DRM[DATAREF]), ALLEXCEPT(DRM, DRM[Carteira]), DRM[DATAREF] <= 上月月末 ) VAR 上月净值 = CALCULATE( SUM(DRM[VL_MTM_Ativo]) - SUM(DRM[VL_MTM_Passivo]), ALLEXCEPT(DRM, DRM[Carteira]), DRM[DATAREF] = 上月最后有效日期 ) RETURN 当前净值 - 上月净值
如果每行是Carteira+DATAREF的唯一记录,可简化为:
月度变动 = VAR 当前净值 = DRM[VL_MTM_Ativo] - DRM[VL_MTM_Passivo] VAR 上月最后有效日期 = CALCULATE( MAX(DRM[DATAREF]), ALLEXCEPT(DRM, DRM[Carteira]), DRM[DATAREF] <= EOMONTH(DRM[DATAREF], -1) ) VAR 上月净值 = CALCULATE( DRM[VL_MTM_Ativo] - DRM[VL_MTM_Passivo], ALLEXCEPT(DRM, DRM[Carteira]), DRM[DATAREF] = 上月最后有效日期 ) RETURN 当前净值 - 上月净值
内容的提问来源于stack exchange,提问作者Igor Mendonça
相关产品推荐
相关产品推荐

