Power BI制作帕累托图时无法引用DATATABLE计算累计值求助
错误原因
你收到报错的核心问题是SUMMARIZE函数的基表选择错误:你在SUMMARIZE第一个参数传入了ALLSELECTED(DI_Report),但DI_Report表本身不存在你自建查找表中的Code字段,因此系统无法识别该列,直接抛出错误。累计计算的维度是你用DATATABLE创建的查找表的Code字段,因此所有聚合逻辑的基表必须基于该查找表。
解决方案
我们可以直接基于你已有的[DI Codes Total]度量值,编写两个新度量值实现累计额与累计占比计算:
1. 累计值度量值
DI 编码累计值 = VAR CurrentRowTotal = [DI Codes Total] // 提取当前筛选上下文下所有选中的DI编码及其对应统计值 VAR AllCodeWithTotal = ADDCOLUMNS( ALLSELECTED('Table'[Code]), "@CalcTotal", [DI Codes Total] ) // 筛选出统计值大于等于当前行的所有编码,求和得到累计值 VAR CumulativeSum = SUMX( FILTER( AllCodeWithTotal, [@CalcTotal] >= CurrentRowTotal ), [@CalcTotal] ) RETURN CumulativeSum
2. 累计占比度量值
DI 编码累计占比 = // 计算所有选中编码的总统计值 VAR TotalOfAllCodes = CALCULATE([DI Codes Total], ALLSELECTED('Table'[Code])) // 累计值除以总值得出占比,DIVIDE第三参数避免除以0报错 RETURN DIVIDE([DI 编码累计值], TotalOfAllCodes, 0)
创建完成后,将两个度量值放入表格视觉对象即可得到你要的Excel同款效果。
实现原理
- 帕累托图的累计逻辑默认是按指标值从高到低排序累计,上述度量值通过
[@CalcTotal] >= CurrentRowTotal的判断条件,自动实现了按统计值降序的累计规则,不需要额外对表格排序。 ALLSELECTED('Table'[Code])的作用是保留页面切片器、筛选器对Code的筛选范围,只在用户选中的编码范围内做累计计算,不会超出筛选上下文。- 如果你的场景需要按编码的字符顺序而非统计值大小排序累计,只需要把累计值度量值中FILTER的条件改为
'Table'[Code] <= MAX('Table'[Code])即可。
优化建议
- 建议将你当前命名为
Table的Code查找表重命名为DI_Code_List等具备业务含义的名称,避免后续开发过程中表名混淆。 - 如果DI_Report表的数据量较大,当前用FIND逐行匹配字符串的计算效率较低,你可以在Power Query编辑器中将
DI Codes列按分隔符拆分、逆透视为一行对应一个DI编码的结构化表,后续统计和计算的效率会大幅提升,也不需要编写复杂的字符串匹配度量值。
内容的提问来源于stack exchange,提问作者Lobo1908
相关产品推荐
相关产品推荐

