Power BI上月值计算异常:DAX公式返回当月值问题排查
问题分析与解决方案
问题场景
我有一张FinalRawData表,存储特定ID(电路)的月度发票数据:
- 金额字段:
Total (USD) - 日期字段:
Invoice Date(关联Calendar[Date]表)
需求:计算当前发票与**上一张发票(无需为连续月份)**的金额差异,当差异满足以下任一条件时返回正负差值,否则返回空值:
- 差异绝对值超过1000美元
- 差异绝对值超过当前金额的10%
但当前DAX公式未返回正确差异值,反而返回当月金额。
原DAX公式
Amount_Difference = VAR CurrentRowDate = MAX('finalrawdata'[Invoice Date]) VAR CurrentRowItem = MAX('finalrawdata'[Item]) VAR CurrentRowAmount = MAX('finalrawdata'[Total (USD)]) VAR PreviousMonthAmount = CALCULATE( SUM('finalrawdata'[Total (USD)]), 'finalrawdata'[Invoice Date] = EOMONTH(CurrentRowDate, -1), 'finalrawdata'[Item] = CurrentRowItem ) VAR AmountDiff = CurrentRowAmount - PreviousMonthAmount RETURN IF( ABS(AmountDiff) > 1000 || ABS(AmountDiff) > CurrentRowAmount * 0.1, AmountDiff, BLANK() )
问题原因
- 日期匹配逻辑错误:原公式用
EOMONTH(CurrentRowDate, -1)强制匹配上月月末日期,但需求是找上一张发票的实际日期(无需连续月份)。如果当前Item上月没有发票,PreviousMonthAmount会返回空值,此时CurrentRowAmount - BLANK()等于CurrentRowAmount,导致返回当月值。 - 金额计算逻辑不准确:用
MAX('finalrawdata'[Total (USD)])获取当前金额,若同一Item当月有多条发票记录,会取最大值而非总金额,不符合月度发票数据的统计逻辑。
修正后的DAX公式
Amount_Difference = VAR CurrentRowItem = MAX('finalrawdata'[Item]) VAR CurrentRowDate = MAX('finalrawdata'[Invoice Date]) -- 获取当前Item的上一张发票日期(早于当前日期的最大发票日期) VAR PreviousInvoiceDate = CALCULATE( MAX('finalrawdata'[Invoice Date]), ALL('finalrawdata'), 'finalrawdata'[Item] = CurrentRowItem, 'finalrawdata'[Invoice Date] < CurrentRowDate ) -- 计算当前Item当月的总金额 VAR CurrentAmount = CALCULATE( SUM('finalrawdata'[Total (USD)]), 'finalrawdata'[Item] = CurrentRowItem, 'finalrawdata'[Invoice Date] = CurrentRowDate ) -- 计算上一张发票的总金额 VAR PreviousAmount = CALCULATE( SUM('finalrawdata'[Total (USD)]), 'finalrawdata'[Item] = CurrentRowItem, 'finalrawdata'[Invoice Date] = PreviousInvoiceDate ) VAR AmountDiff = CurrentAmount - PreviousAmount RETURN IF( -- 仅当存在上一张发票时才判断差异条件 NOT(ISBLANK(PreviousAmount)) && (ABS(AmountDiff) > 1000 || ABS(AmountDiff) > CurrentAmount * 0.1), AmountDiff, BLANK() )
修正说明
- 日期逻辑修正:通过筛选当前Item下早于当前日期的最大发票日期,精准定位上一张发票,不再依赖固定上月日期。
- 金额计算修正:改用
SUM统计月度总金额,确保多发票记录时的结果准确。 - 空值处理:增加
NOT(ISBLANK(PreviousAmount))判断,避免无历史发票时返回错误的当月金额。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

