请求将指定Excel条件公式转换为DAX公式
解决Excel公式转DAX的问题
嘿,我来帮你搞定这个DAX转换!先把你的Excel公式逻辑拆解清楚,这样转换起来就一目了然了:
你的原公式核心逻辑是:
- 当当前行和上一行的代码(B列)相同,且**当前行N列是"Extraordinary Trip"**时:
- 如果上一行N列不是"Extraordinary Trip",就返回上一行的C列日期
- 如果上一行N列也是"Extraordinary Trip",就返回上一行的E列日期
- 所有其他情况,直接返回当前行的C列日期
DAX实现方案(两种写法)
方法1:用OFFSET函数(DAX 2021及以上版本支持,更简洁)
这个函数可以直接定位到上一行,非常直观,前提是你要有一个能确定行顺序的排序列(比如行号、业务日期,和Excel里的行顺序一致):
Extraordinary Trip Date = VAR CurrentCode = [代码] // 替换成你表中对应B列的列名 VAR CurrentN = [N列] // 替换成你表中对应N列的列名 // 获取上一行的上下文,这里的排序列要选能确定行顺序的字段 VAR PrevRow = OFFSET(-1, ALLSELECTED('你的表名'), ORDERBY('你的表名'[排序列], ASC)) VAR PrevCode = MAXX(PrevRow, [代码]) VAR PrevN = MAXX(PrevRow, [N列]) VAR PrevC = MAXX(PrevRow, [C列]) // 对应原Excel的C列 VAR PrevE = MAXX(PrevRow, [E列]) // 对应原Excel的E列 RETURN IF( CurrentCode = PrevCode && CurrentN = "Extraordinary Trip", IF( PrevN <> "Extraordinary Trip", PrevC, PrevE ), [C列] )
方法2:兼容旧版DAX(用CALCULATE+行号)
如果你的DAX版本不支持OFFSET,可以先给表加一个行号列,再通过行号定位上一行:
首先给表添加行号(如果没有现成的):
带行号的表 = ADDCOLUMNS('你的表名', "行号", RANKX('你的表名', [C列], , ASC, Dense))
然后基于带行号的表写计算列:
Extraordinary Trip Date = VAR CurrentCode = [代码] VAR CurrentRowIndex = [行号] VAR CurrentN = [N列] VAR PrevCode = CALCULATE(MAX([代码]), FILTER('带行号的表', [行号] = CurrentRowIndex - 1)) VAR PrevN = CALCULATE(MAX([N列]), FILTER('带行号的表', [行号] = CurrentRowIndex - 1)) VAR PrevC = CALCULATE(MAX([C列]), FILTER('带行号的表', [行号] = CurrentRowIndex - 1)) VAR PrevE = CALCULATE(MAX([E列]), FILTER('带行号的表', [行号] = CurrentRowIndex - 1)) RETURN IF( CurrentCode = PrevCode && CurrentN = "Extraordinary Trip", IF( PrevN <> "Extraordinary Trip", PrevC, PrevE ), [C列] )
注意事项
- 一定要确保排序列/行号的顺序和你Excel中的行顺序完全一致,否则会取到错误的上一行数据
- 替换代码中的
'你的表名'和所有列名,匹配你实际的模型字段
内容的提问来源于stack exchange,提问作者acmferreira
相关产品推荐
相关产品推荐

