PowerBI DAX问题:基于切片器按ID和日期对比金额差值
DAX公式问题:计算同一ID下指定日期的金额差值
需求说明
通过切片器选择名称与两个日期,计算同一ID下这两个日期对应的金额差值。
表格示例

当前使用的DAX公式
Difference = VAR amnt = MAX ( 'Table'[Amount] ) VAR id = MAX ( 'Table'[Id] ) VAR _currentlyVisibleDate = MAX ( 'Table'[Date] ) VAR _immediatelyPrecedingDate = CALCULATE ( MAX ( 'Table'[Date] ), 'Table'[Date] < _currentlyVisibleDate ) RETURN amnt - CALCULATE ( MAX ( 'Table'[Amount] ), FILTER ( ALL ( 'Table' ), 'Table'[Id] = _id && 'Table'[Date] = _immediatelyPrecedingDate ) )
公式问题分析
- 逻辑不符需求:原公式取的是当前可见日期的前一个最大日期,而非切片器选中的两个指定日期,无法实现“对比选中的两个日期”的目标。
- 筛选上下文被破坏:
ALL('Table')会忽略切片器的名称筛选条件,导致结果可能混入未选中名称的数据。 - 日期识别错误:当切片器选中两个日期时,
MAX('Table'[Date])仅能获取其中较大的日期,无法同时识别两个选中日期。
修正后的DAX公式
方案1:使用独立日期表(推荐)
先创建一个独立的日期表(与原表无关联或单向关联)用于切片器选择日期,避免筛选上下文冲突:
金额差值 = VAR 选中日期列表 = VALUES('日期表'[Date]) VAR 较早日期 = MINX(选中日期列表, [Date]) VAR 较晚日期 = MAXX(选中日期列表, [Date]) VAR 当前ID = MAX('Table'[Id]) VAR 较早日期金额 = CALCULATE(MAX('Table'[Amount]), 'Table'[Date] = 较早日期, 'Table'[Id] = 当前ID) VAR 较晚日期金额 = CALCULATE(MAX('Table'[Amount]), 'Table'[Date] = 较晚日期, 'Table'[Id] = 当前ID) RETURN 较晚日期金额 - 较早日期金额
方案2:直接使用原表日期切片器
如果不使用独立日期表,需通过ALLSELECTED获取选中的日期范围,并清除原表的日期筛选以获取对应金额:
金额差值 = VAR 选中日期列表 = ALLSELECTED('Table'[Date]) VAR 较早日期 = MINX(选中日期列表, [Date]) VAR 较晚日期 = MAXX(选中日期列表, [Date]) VAR 当前ID = MAX('Table'[Id]) VAR 较早日期金额 = CALCULATE(MAX('Table'[Amount]), ALL('Table'[Date]), 'Table'[Date] = 较早日期, 'Table'[Id] = 当前ID) VAR 较晚日期金额 = CALCULATE(MAX('Table'[Amount]), ALL('Table'[Date]), 'Table'[Date] = 较晚日期, 'Table'[Id] = 当前ID) RETURN 较晚日期金额 - 较早日期金额
说明
- 两个方案均假设切片器仅选中两个日期,若多选会自动取最早和最晚日期计算差值。
- 保留了切片器的名称筛选上下文,确保仅计算选中名称下的数据。
内容的提问来源于stack exchange,提问作者Jade
相关产品推荐
相关产品推荐

