Power BI中无循环实现Left Over累计计算的DAX方案求助
解决Power BI中累计Left Over的DAX实现
核心逻辑转换
你需要的循环计算逻辑,本质等价于从第一个周期到当前周期的所有Created - Closed的累计和,因此无需依赖循环,直接通过DAX的累计求和能力即可实现。
步骤1:创建日期排序列
由于原始数据的Month是文本格式,无法按时间正确排序,先添加一个日期列用于统一排序:
Date = DATE([Year], SWITCH([Month], "Jan",1, "Feb",2, "Mar",3, "Apr",4, "May",5, "Jun",6, "Jul",7, "Aug",8, "Sept",9, "Oct",10, "Nov",11, "Dec",12), 1)
该列将Year和Month转换为当月第一天的标准日期,确保时间顺序准确。
步骤2:创建计算列(静态行级结果)
如果需要在数据表中直接生成每行的Left Over值,使用以下DAX公式创建计算列:
Left Over = VAR CurrentPeriodDate = [Date] VAR AllPriorPeriods = FILTER('你的表名', '你的表名'[Date] <= CurrentPeriodDate) RETURN SUMX(AllPriorPeriods, '你的表名'[Created] - '你的表名'[Closed])
CurrentPeriodDate:获取当前行的日期AllPriorPeriods:筛选出所有早于等于当前行的周期数据SUMX:计算这些周期的Created-Closed总和,即累计的Left Over
步骤3:创建度量值(动态上下文计算)
如果需要在可视化(如矩阵、图表)中根据筛选条件动态展示累计值,使用度量值:
Left Over Measure = VAR CurrentMaxDate = MAX('你的表名'[Date]) VAR AllPriorPeriods = FILTER(ALL('你的表名'), '你的表名'[Date] <= CurrentMaxDate) RETURN SUMX(AllPriorPeriods, '你的表名'[Created] - '你的表名'[Closed])
ALL('你的表名'):忽略当前可视化的上下文筛选,确保计算从第一个周期开始的累计值MAX('你的表名'[Date]):获取当前上下文的最大日期,确定累计截止周期
验证示例数据
用你提供的测试数据验证,结果完全匹配预期:
| Year | Month | Created | Closed | Left Over |
|---|---|---|---|---|
| 2018 | Jan | 10 | 9 | 1 |
| 2019 | Jan | 20 | 10 | 11 |
| 2019 | Feb | 25 | 10 | 26 |
| 2019 | Apr | 40 | 30 | 36 |
| 2019 | Mar | 30 | 15 | 51 |
| 2020 | May | 12 | 10 | 53 |
| 2020 | Jun | 15 | 15 | 53 |
| 2020 | Jul | 20 | 15 | 58 |
| 2020 | Sept | 20 | 10 | 68 |
| 2021 | Feb | 60 | 35 | 93 |
| 2021 | Apr | 45 | 35 | 103 |
| 2021 | May | 50 | 20 | 133 |
| 2022 | Oct | 55 | 40 | 148 |
内容的提问来源于stack exchange,提问作者Nelly Yuki
相关产品推荐
相关产品推荐

