按日历期间对条件型DAX度量值计算正确小计
相关数据表(内置日历表除外)
LocationDim表
| Location Code | Location Name | Category |
|---|---|---|
| LOC1 | Location 1 | CAT1 |
| LOC2 | Location 2 | CAT2 |
SalesFact表
| Period | Location Code | Value |
|---|---|---|
| 2022-08-01 | LOC1 | 1000 |
| 2022-08-01 | LOC2 | 2000 |
我创建了一个条件型度量值,当COUNTX计算的结果超过依赖地点类别的阈值(如5)时,将其乘以系数。代码如下:
[Volume] = COUNTX ( 'SalesFact', 'SalesFact'[Location Code] ) [MultiplierBase] = VAR BranchCategory = IF ( HASONEVALUE ( 'LocationDim'[Category] ), VALUES ( 'LocationDim'[Category] ) ) VAR TargetVolume = IF ( OR ( BranchCategory = "CAT2", BranchCategory = "CAT3" ), 2, 5 ) VAR CurrentVolume = [Volume] VAR Result = IF ( AND ( HASONEVALUE ( 'Calendar'[Date] ), HASONEVALUE ( 'LocationDim'[Location Code] ) ), IF ( CurrentVolume >= TargetVolume, [Volume] * 5 ) ) RETURN Result
熟悉DAX的人都清楚,内置小计无法支持这个度量值的条件逻辑。我尝试以该度量值为基础,单独编写度量计算小计,但多次尝试均未得到正确结果。以下是我最新的尝试代码,依然不正确:
CALCULATE ( SUMX ( 'SalesFact', [MultiplierBase] ), 'Calendar'[Date] <= MaxDate, 'Calendar'[Date] >= MinDate, ALL ( 'Calendar'[Date] ) )
预期结果
每日时间范围(-代表空白)
| 行标签 | 2022-08-02 | 2022-08-02 |
|---|---|---|
| LOC2 | - | - |
| Volume | 2 | 1 |
| MultiplierBase | 10 | - |
月度时间范围(-代表空白)
| 行标签 | 2022年8月 |
|---|---|
| LOC2 | - |
| Volume | 3 |
| MultiplierBase | 10 |
解决方法
核心思路是在最细粒度(日期+地点)上计算符合条件的值,再向上聚合,规避内置小计的逻辑冲突。
步骤1:重构基础度量,移除上下文限制
修改MultiplierBase,让它能在任意上下文下返回最细粒度的计算结果,而非仅在单个日期+单个地点的上下文生效:
[MultiplierBase_Granular] = VAR CurrentLocation = SELECTEDVALUE('LocationDim'[Location Code]) VAR BranchCategory = SELECTEDVALUE('LocationDim'[Category]) VAR TargetVolume = IF(OR(BranchCategory = "CAT2", BranchCategory = "CAT3"), 2, 5) -- 计算当前地点+当前日期的Volume VAR CurrentVolume = CALCULATE([Volume], ALLEXCEPT('SalesFact', 'SalesFact'[Location Code], 'Calendar'[Date])) RETURN IF(CurrentVolume >= TargetVolume, CurrentVolume * 5, BLANK())
步骤2:创建小计度量,按细粒度聚合
基于上述细粒度度量,用SUMX遍历所有(日期+地点)的组合来计算小计:
[MultiplierBase_Total] = VAR DateLocationPairs = SUMMARIZE( 'SalesFact', 'Calendar'[Date], 'LocationDim'[Location Code] ) RETURN SUMX(DateLocationPairs, [MultiplierBase_Granular])
说明
MultiplierBase_Granular确保每个(日期+地点)组合都能独立判断是否满足阈值,并返回对应值或空白。MultiplierBase_Total通过遍历所有(日期+地点)组合,将每个组合的计算结果求和,得到正确的小计/总计。- 在报表中使用该度量时,无论是每日视图还是月度视图,都会自动按当前上下文的日期范围和地点范围聚合出正确结果。
内容的提问来源于stack exchange,提问作者rndldvl
相关产品推荐
相关产品推荐

