DAX中含IF逻辑的当期与上期(季度)差值计算问题求助
修正DAX季度差值计算问题
需求与问题
- 计算规则:
- 当
Value<>0时,差值 = 当期Value- 上一季度Value - 当
Value=0(Sale场景)时,差值 = 当期Sale- 上一季度Value
- 当
- 异常情况:第一部分逻辑正常,但Sale场景下仅显示当期Sale值,未正确减去上季度Value
当前使用的DAX公式
Calculate = IF ( SUM ( 'Append'[Value] ) <> 0, SUM ( 'Append'[Value] ) - CALCULATE ( SUM ( 'Append'[Value] ), PARALLELPERIOD ( 'Append'[DATE_REFERENCE], -1, QUARTER ) ), CALCULATE ( SUM ( Append[Sale] ), KEEPFILTERS ( 'Append'[Status] = "Sale" ) ) - CALCULATE ( SUM ( 'Append'[Value] ), PARALLELPERIOD ( 'Append'[DATE_REFERENCE], -1, QUARTER ) ) )
结果对比
当前结果
| 代码 | 参考日期 | 状态 | 销售额 | 数值 | 计算值 |
|---|---|---|---|---|---|
| 30 | 31/12/2023 | Value | 0 | 756527 | - |
| 30 | 31/03/2024 | Value | 0 | 756527 | - |
| 30 | 30/06/2024 | Value | 0 | 815173 | 58646 |
| 31 | 31/12/2023 | Value | 0 | 557133 | - |
| 31 | 31/03/2024 | Sale | -475000 | 0 | -475000 |
| 31 | 30/06/2024 | Value | 0 | 0 | - |
| 32 | 31/12/2023 | Value | 0 | 351873 | - |
| 32 | 31/03/2024 | Value | 0 | 351873 | - |
| 32 | 30/06/2024 | Sale | -300000 | 0 | -300000 |
预期结果
| 代码 | 参考日期 | 状态 | 销售额 | 数值 | 计算值 |
|---|---|---|---|---|---|
| 30 | 31/12/2023 | Value | 0 | 756527 | - |
| 30 | 31/03/2024 | Value | 0 | 756527 | - |
| 30 | 30/06/2024 | Value | 0 | 815173 | 58646 |
| 31 | 31/12/2023 | Value | 0 | 557133 | - |
| 31 | 31/03/2024 | Sale | -475000 | 0 | 82133 |
| 31 | 30/06/2024 | Value | 0 | 0 | - |
| 32 | 31/12/2023 | Value | 0 | 351873 | - |
| 32 | 31/03/2024 | Value | 0 | 351873 | - |
| 32 | 30/06/2024 | Sale | -300000 | 0 | 51873 |
问题原因与修正方案
原因分析
Sale场景下,当前行的Status = "Sale"筛选会被传递到计算上季度Value的CALCULATE中,而上季度对应的是Status = "Value"的记录,导致该CALCULATE返回0,最终差值等于当期Sale值。
修正后的DAX公式
Calculate = VAR CurrentValue = SUM('Append'[Value]) VAR PreviousValue = CALCULATE( SUM('Append'[Value]), PARALLELPERIOD('Append'[DATE_REFERENCE], -1, QUARTER), REMOVEFILTERS('Append'[Status]) -- 清除Status筛选,确保取到上季度的Value记录 ) VAR CurrentSale = CALCULATE(SUM('Append'[Sale]), KEEPFILTERS('Append'[Status] = "Sale")) RETURN IF( CurrentValue <> 0, CurrentValue - PreviousValue, IF(ISBLANK(PreviousValue), BLANK(), CurrentSale - PreviousValue) -- 无上期值时返回空 )
关键修改点
- 用变量封装各部分计算,提升可读性
- 在计算
PreviousValue时添加REMOVEFILTERS('Append'[Status]),清除当前行的Status筛选,确保能正确获取上季度的Value数据 - 增加判断:如果上期值为空(无对应记录),返回空值,保持与其他无上期数据的行一致
验证结果
- 代码31的2024年3月期:
-475000 - (-557133) = 82133,与预期一致 - 代码32的2024年6月期:
-300000 - (-351873) = 51873,与预期一致
内容的提问来源于stack exchange,提问作者QuentinGr
相关产品推荐
相关产品推荐

