如何在Power BI中按行主组总计计算子组占比并制作堆叠条形图?
解决方案:Power BI 分类3项目占行总计百分比的堆叠条形图
我完全懂你刚接触Power BI时的这种头疼——毕竟从Excel的单元格思维转过来,上下文筛选和度量值的逻辑确实容易卡壳。你试过8种方法都没成,肯定急坏了,咱们一步步来搞定这个堆叠条形图:
第一步:自动筛选最新月份的数据
先创建一个度量值来锁定最新月份,不用手动反复调整筛选器:
Latest Month = VAR MaxMonth = CALCULATE(MAX('你的数据表名'[月份]), ALL('你的数据表名')) RETURN IF(SELECTEDVALUE('你的数据表名'[月份]) = MaxMonth, 1, 0)
创建好后,把这个度量值拖到页面级筛选器里,设置为「等于1」,报表就只会显示最新月份的数据了。
第二步:计算每个人员的行总计(绿色高亮值)
这是核心步骤,我们需要拿到每个人员所有分类下a+b的总和(也就是你说的绿色高亮总计)。这里用ALLEXCEPT来精准保留「人员」的上下文,同时忽略分类、项目(a/b)的筛选干扰:
人员行总计(绿色高亮) = CALCULATE( SUM('你的数据表名'[数值列]), -- 替换成你存储a、b数值的实际列名 ALLEXCEPT('你的数据表名', '你的数据表名'[人员]), '你的数据表名'[月份] = [Latest Month] )
第三步:计算分类3中a、b的占比
分别创建两个度量值,计算a和b对应占人员行总计的百分比,用DIVIDE可以避免出现除以0的错误:
分类3 - a的百分比
分类3-a百分比 = VAR CurrentAValue = CALCULATE( SUM('你的数据表名'[数值列]), '你的数据表名'[分类] = "分类3", '你的数据表名'[项目] = "a", '你的数据表名'[月份] = [Latest Month] ) VAR PersonTotal = [人员行总计(绿色高亮)] RETURN IF(NOT ISBLANK(PersonTotal), DIVIDE(CurrentAValue, PersonTotal), 0)
分类3 - b的百分比
分类3-b百分比 = VAR CurrentBValue = CALCULATE( SUM('你的数据表名'[数值列]), '你的数据表名'[分类] = "分类3", '你的数据表名'[项目] = "b", '你的数据表名'[月份] = [Latest Month] ) VAR PersonTotal = [人员行总计(绿色高亮)] RETURN IF(NOT ISBLANK(PersonTotal), DIVIDE(CurrentBValue, PersonTotal), 0)
第四步:搭建堆叠条形图
- 从可视化面板拖入「堆叠条形图」
- 把字段列表里的**[人员]**拖到「Y轴」(如果想横向展示就拖到X轴,看你偏好)
- 把刚刚创建的**[分类3-a百分比]和[分类3-b百分比]**拖到「值」区域
- 点击轴的格式设置,把显示单位改成「百分比」,调整小数位数到你需要的精度
- 确认页面筛选器里的
Latest Month已经设置为1,确保只显示最新月份数据
为啥之前的度量值没成功?
Excel是基于单元格的静态计算,但Power BI是上下文驱动的——你选的可视化字段、筛选器都会直接影响度量值的计算结果。之前的尝试大概率没精准控制上下文,要么没保留「人员」的筛选范围,要么没排除分类、项目的干扰,导致拿到的总计不是你要的绿色高亮值。ALLEXCEPT就是帮你精准控制哪些上下文要保留、哪些要忽略的关键工具。
内容的提问来源于stack exchange,提问作者Brandon Lewallen




