PowerBI报表服务器:如何将度量值计算的Bin值设为堆叠柱形图X轴
解决方案一:切片器+动态Bin表+度量值统计(支持自定义Bin大小)
制作Bin大小选择器
- 切换到「数据」视图,点击「输入数据」,创建名为
BinSizeSelector的表,列名设为SelectedBinSize,填入常用的Bin大小值(比如100、200、500);如果需要支持连续调整,直接用数值范围切片器绑定该列即可。
- 切换到「数据」视图,点击「输入数据」,创建名为
生成全量Bin编号表
- 先在
Product表中添加两个度量值,获取SN的极值:MinSN = MIN(Product[SN]) MaxSN = MAX(Product[SN]) - 进入「转换数据」界面,新建空白查询,粘贴以下M代码生成
Bins表(会根据选中的Bin大小自动计算所需的Bin数量):let MinSN = Number.From(Excel.CurrentWorkbook(){[Name="MinSN"]}[Content]{0}[Column1]), MaxSN = Number.From(Excel.CurrentWorkbook(){[Name="MaxSN"]}[Content]{0}[Column1]), BinSize = Number.From(Excel.CurrentWorkbook(){[Name="BinSizeSelector"]}[Content]{0}[SelectedBinSize]), TotalBins = Number.RoundUp((MaxSN - MinSN)/BinSize), BinNumbers = List.Generate(()=>1, each _ <= TotalBins, each _ +1) in Table.FromList(BinNumbers, Splitter.SplitByNothing(), {"BinNumber"}) - 如果报表服务器动态刷新有问题,可直接预生成足够多的Bin编号(比如0到2000),后续用度量值过滤无数据的Bin即可。
- 先在
编写统计度量值
- 创建度量值,计算每个Bin下各设备类型的数量:
设备数量 = VAR 当前Bin = SELECTEDVALUE(Bins[BinNumber]) VAR 选中Bin大小 = SELECTEDVALUE(BinSizeSelector[SelectedBinSize]) VAR SN最小值 = MIN(Product[SN]) VAR Bin起始值 = SN最小值 + (当前Bin -1)*选中Bin大小 VAR Bin结束值 = Bin起始值 + 选中Bin大小 -1 RETURN CALCULATE( COUNT(Product[设备类型]), FILTER( ALL(Product), Product[SN] >= Bin起始值 && Product[SN] <= Bin结束值 ) ) - 若需按SN去重计数,将
COUNT(Product[设备类型])替换为COUNTROWS(DISTINCT(Product[SN]))即可。
- 创建度量值,计算每个Bin下各设备类型的数量:
搭建堆叠柱形图
- 将
Bins[BinNumber]拖至X轴,Product[设备类型]拖至图例,设备数量拖至值区域。调整切片器的Bin大小,图表会自动同步更新。
- 将
解决方案二:书签+预定义Bin列(适合固定几种常用配置)
如果不需要灵活调整Bin大小,仅需支持几个常用配置,用书签切换更简单:
为常用Bin大小创建计算列
- 在
Product表中添加多个计算列,对应不同的固定Bin大小:Bin_100 = FLOOR((Product[SN] - MIN(Product[SN]))/100,1)+1 Bin_200 = FLOOR((Product[SN] - MIN(Product[SN]))/200,1)+1 Bin_500 = FLOOR((Product[SN] - MIN(Product[SN]))/500,1)+1
- 在
创建多个柱形图
- 分别制作3个堆叠柱形图,每个图表的X轴对应一个Bin计算列,值均为设备类型的数量。
用书签实现切换
- 为每个图表创建书签,设置仅显示当前图表、隐藏其余两个。在报表页面添加按钮并绑定对应书签,用户点击按钮即可切换不同Bin大小的视图。
踩坑提示
- 若方案一的动态M表在报表服务器无法正常刷新,预生成足够多的Bin编号后,可修改度量值过滤空Bin:
设备数量 = VAR 当前Bin = SELECTEDVALUE(Bins[BinNumber]) VAR 选中Bin大小 = SELECTEDVALUE(BinSizeSelector[SelectedBinSize]) VAR SN最小值 = MIN(Product[SN]) VAR Bin起始值 = SN最小值 + (当前Bin -1)*选中Bin大小 VAR Bin结束值 = Bin起始值 + 选中Bin大小 -1 VAR 存在数据 = CALCULATE(COUNTROWS(Product), Product[SN]>=Bin起始值 && Product[SN]<=Bin结束值) RETURN IF(存在数据>0, 存在数据, BLANK())
内容的提问来源于stack exchange,提问作者Murphy013
相关产品推荐
相关产品推荐

