在DAX中复刻Excel数组公式:按销售额加权计算层级Value值
DAX 层级加权Value计算解决方案
核心逻辑
加权汇总的本质是Σ(子项销售额 × 子项Value) ÷ 父层级总销售额,通过这个公式可实现不同层级按销售额占比加权计算Value的需求。
基础度量值(先确保基础数据计算正确)
- 销售额度量:
Sales = SUM(Table2[Sales]) - 区域级Value度量:
Area Value = SUM(Table1[Value])
分层级加权度量值
1. 子品类(Sub Category)层级加权Value
Weighted Value (Sub Category) = DIVIDE( // 分子:遍历每个区域,计算销售额×对应Value的总和 SUMX(VALUES(Table1[Area]), [Sales] * [Area Value]), // 分母:当前子品类下的总销售额(清除区域筛选,保留子品类筛选) CALCULATE([Sales], ALL(Table1[Area])) )
2. 品类(Category)层级加权Value
直接基于区域数据计算更高效:
Weighted Value (Category) = DIVIDE( // 分子:当前品类下所有区域的销售额×Value总和 SUMX(VALUES(Table1[Area]), [Sales] * [Area Value]), // 分母:当前品类下的总销售额(清除区域、子品类筛选,保留品类筛选) CALCULATE([Sales], ALL(Table1[Area], Table1[Sub Category])) )
自适应多层级的统一度量值
如果需要一个度量自动适配Area/Sub Category/Category层级,可使用ISINSCOPE判断上下文:
Weighted Value = VAR CurrentContext = SWITCH( TRUE(), // 区域层级直接返回区域Value ISINSCOPE(Table1[Area]), [Area Value], // 子品类层级计算加权值 ISINSCOPE(Table1[Sub Category]), DIVIDE( SUMX(VALUES(Table1[Area]), [Sales] * [Area Value]), CALCULATE([Sales], ALL(Table1[Area])) ), // 品类层级计算加权值 ISINSCOPE(Table1[Category]), DIVIDE( SUMX(VALUES(Table1[Area]), [Sales] * [Area Value]), CALCULATE([Sales], ALL(Table1[Area], Table1[Sub Category])) ), BLANK() ) RETURN CurrentContext
关键说明
- 原公式
SUMX(Table1, Value)仅做了Value的直接求和,未引入销售额权重,因此无法得到加权结果;AVERAGEX是简单算术平均,不考虑销售额占比,不符合需求。 - 使用
DIVIDE而非直接除法,可避免总销售额为0时的错误,返回BLANK()更友好。 - 确保
Table1与Table2通过Area、Sub Category、Category字段建立正确的关联关系,上下文筛选才能生效。
内容的提问来源于stack exchange,提问作者user2378437
相关产品推荐
相关产品推荐

