DAX技术问题:无法通过度量值筛选统计GNum x AVG=1的账户数量
DAX度量值问题:统计GNum x AVG=1的账户数量
我编写的度量值GNum Count Class 1无法正常统计分类平均值(GNum x AVG)等于1的账户数量,其余相关度量值均可正常运行。
故障度量值代码
GNum Count Class 1 = CALCULATE ( [Count Values Minus 0] , FILTER ( TableClass_Details, [GNum x AVG] = 1 ) )
正常运行的相关度量值
GNum x AVG:
GNum x AVG = ([Class Account Income] + [Class Account Size]) / 2
Class Account Income:
Class Account Income = SWITCH(TRUE(), SUMX(TableClass_Details, TableClass_Details[Income]) >= 10000,1, SUMX(TableClass_Details, TableClass_Details[Income]) >= 5000 && SUMX(TableClass_Details, TableClass_Details[Income]) <= 9999,2, 3)
Count Values Minus 0:
Count Values Minus 0 = CALCULATE( COUNTROWS(TableClass_Details) ,TableClass_Details[Income] > 0 )
示例数据
| Account | Income | Size |
|---|---|---|
| A128 | 100 | 5000 |
| A129 | 7000 | 400 |
| A130 | 20000 | 15000 |
| A131 | 8020 | 7000 |
| A132 | 15000 | 10000 |
| A133 | 600 | 15000 |
| A134 | 8000 | 400 |
| A135 | 150 | 200 |
问题原因
原度量值的核心问题在于上下文错误:FILTER(TableClass_Details, [GNum x AVG] = 1)是逐行遍历表,但[GNum x AVG]依赖的Class Account Income使用了SUMX(TableClass_Details, ...),这会计算整个表的Income总和,而非当前账户的Income。因此,[GNum x AVG]在FILTER中返回的是全局平均值,无法匹配单个账户的分类等级。
解决方案
方案1:修正度量值的上下文计算
先为每个账户单独计算GNum x AVG,再筛选统计:
GNum Count Class 1 = VAR AccountWithClass = ADDCOLUMNS( VALUES(TableClass_Details[Account]), // 获取所有唯一账户 "@GNumAVG", [GNum x AVG], // 计算每个账户的GNum x AVG "@Income", SUM(TableClass_Details[Income]) // 检查账户Income是否大于0 ) RETURN COUNTROWS( FILTER( AccountWithClass, [@GNumAVG] = 1 && [@Income] > 0 ) )
方案2:修正基础度量值的聚合逻辑
将Class Account Income中的SUMX改为SUM,让它在单个账户的上下文下正确计算:
Class Account Income = VAR AccountIncome = SUM(TableClass_Details[Income]) RETURN SWITCH(TRUE(), AccountIncome >= 10000, 1, AccountIncome >= 5000 && AccountIncome <= 9999, 2, 3 )
同理,Class Account Size也需要做类似修改(假设其逻辑与Class Account Income一致),之后原GNum Count Class 1度量值即可正常工作。
内容的提问来源于stack exchange,提问作者Johnny Spindler
相关产品推荐
相关产品推荐

