PowerBI中按SKU计算滚动求和最大值的DAX实现问题
问题描述
我正在用PowerBI和DAX计算滚动求和的最大值。已经通过DAX度量值实现了按SKU和提前期计算滚动求和(Rolling Sum),该度量值运行正常,表达式如下:
Rolling Sum = VAR CurrentDate = MAX(dgSalesHistoryTSLRollingSum[Delivery Date]) RETURN CALCULATE( SUM('dgSalesHistoryTSLRollingSum'[QtySupplied]), DATESBETWEEN('dgSalesHistoryTSLRollingSum'[Delivery Date], CurrentDate - Max('dgSalesHistoryTSLRollingSum'[LeadTime(d)]), CurrentDate) )
现有数据示例:
| SKU | 交付日期 | 提前期 | QtySupplied | Rolling Sum |
|---|---|---|---|---|
| A | 28/03/2023 | 3 | 68 | 68 |
| A | 29/03/2023 | 3 | 32 | 100 |
| A | 30/03/2023 | 3 | 32 | 132 |
| A | 31/03/2023 | 3 | 37 | 169 |
| A | 03/04/2023 | 3 | 12 | 49 |
| A | 04/04/2023 | 3 | 65 | 77 |
| A | 05/04/2023 | 3 | 39 | 116 |
| B | 28/03/2023 | 3 | 539 | 539 |
| B | 29/03/2023 | 3 | 3234 | 3773 |
| B | 30/03/2023 | 3 | 328 | 4101 |
| B | 31/03/2023 | 3 | 2313 | 6414 |
| B | 01/04/2023 | 3 | 759 | 6634 |
| B | 03/04/2023 | 3 | 424 | 3496 |
| B | 04/04/2023 | 3 | 549 | 1732 |
| B | 05/04/2023 | 3 | 383 | 1356 |
需要得到每个SKU对应的滚动求和最大值:
| SKU | Max Rolling Sum |
|---|---|
| A | 169 |
| B | 6634 |
尝试使用表达式Max Rolling Sum = CALCULATE(MAX(dgSalesHistoryTSLRollingSum[Rolling Sum]))时,报错提示找不到表中的“Rolling Sum”列或无法在该表达式中使用,请求解决。
解决方案
报错原因是Rolling Sum是度量值,并非表中的物理列,不能直接用MAX(表[Rolling Sum])的方式引用。要计算每个SKU的滚动求和最大值,需通过迭代函数遍历日期上下文,计算对应滚动求和值后取最大。
方法1:使用MAXX迭代函数
Max Rolling Sum = MAXX( VALUES(dgSalesHistoryTSLRollingSum[Delivery Date]), [Rolling Sum] )
- 逻辑:
VALUES(dgSalesHistoryTSLRollingSum[Delivery Date])生成当前SKU下的所有唯一交付日期列表,MAXX遍历每个日期并计算对应Rolling Sum度量值,最终返回这些值中的最大值。
方法2:结合ALLEXCEPT保留SKU筛选上下文
Max Rolling Sum = CALCULATE( MAXX( ALLSELECTED(dgSalesHistoryTSLRollingSum[Delivery Date]), [Rolling Sum] ), ALLEXCEPT(dgSalesHistoryTSLRollingSum, dgSalesHistoryTSLRollingSum[SKU]) )
- 逻辑:
ALLEXCEPT保留SKU的筛选上下文,移除其他列的筛选;ALLSELECTED获取当前筛选范围内的所有交付日期,再通过MAXX计算每个日期的Rolling Sum并取最大值,适合需要保留外部筛选条件的场景。
以上两种方式均可得到目标结果。
内容的提问来源于stack exchange,提问作者David G
相关产品推荐
相关产品推荐

