如何用字段参数构建支持全量/Top10显示的Power BI图表?
问题描述
我有一个包含5个字段的字段参数,想要做个图表让用户选:要么全量显示所有字段值,要么按CountOfItems降序显示Top10。试了写这个度量值:
TOPN(10, SUMMARIZE(CategoryTable, CategoryTable[CategoryDescription], "@Count", [CountOfItems]), [@Count], DESC)
结果报错:The expression refers to multiple columns. Multiple columns cannot be converted to a scalar value.。怎么解决这个错误?另外这个Top10会跟着报表筛选器变吗,还是算全局的?完整实现这个图表该咋弄?
一、错误原因&解决办法
报错的本质是:你写的这段DAX返回的是带两列的表(类别描述和计数),但度量值要求必须返回单个标量值,所以直接这么写肯定不兼容。
不用纠结把TOPN做成度量值,换个思路,用下面两种方案实现:
方案1:做个标记用的度量值,控制筛选
先写个度量值,判断当前类别是不是Top10:
IsTop10 = VAR 当前类别 = SELECTEDVALUE(CategoryTable[CategoryDescription]) VAR Top10列表 = TOPN( 10, ALLSELECTED(CategoryTable[CategoryDescription]), [CountOfItems], DESC ) RETURN IF(当前类别 IN Top10列表, 1, 0)
然后在图表的筛选器里设置逻辑:
- 选“全量显示”时,
IsTop10不做筛选(或者同时选1和0) - 选“Top10显示”时,只留
IsTop10 = 1的行
方案2:结合字段参数,用SWITCH动态返回结果
如果想直接通过参数控制显示内容,写个动态度量值:
动态计数 = VAR 选中的选项 = SELECTEDVALUE(字段参数[字段参数]) VAR Top10表 = TOPN( 10, SUMMARIZE(ALLSELECTED(CategoryTable), CategoryTable[CategoryDescription], "@Count", [CountOfItems]), [@Count], DESC ) VAR 当前计数 = [CountOfItems] RETURN SWITCH( 选中的选项, "全量显示", 当前计数, "Top10显示", IF(SELECTEDVALUE(CategoryTable[CategoryDescription]) IN SELECTCOLUMNS(Top10表, "类别", CategoryTable[CategoryDescription]), 当前计数, BLANK()) )
把这个动态计数放到图表的值区域,字段参数做成切片器。选Top10时,非Top10的类别会显示空白,图表自动把这些行藏起来。
二、Top10会受报表筛选器影响吗?
默认用ALLSELECTED的话,会跟着当前报表的筛选器走(包括切片器、页面筛选、视觉对象筛选),算的是筛选后的Top10。
如果要算全局不受筛选影响的Top10,把ALLSELECTED换成ALL就行:
Top10列表 = TOPN( 10, ALL(CategoryTable[CategoryDescription]), [CountOfItems], DESC )
三、完整实现步骤
- 先建字段参数,加两个选项:“全量显示”、“Top10显示”
- 选上面其中一个方案,创建对应的辅助度量值
- 配置图表:
- 把
CategoryDescription拖到图表的轴区域 - 把
CountOfItems(方案1)或动态计数(方案2)拖到值区域 - 把字段参数做成切片器,让用户切换显示模式
- 方案1的话,在图表筛选器里加规则:当参数选“Top10显示”时,筛选
IsTop10 = 1
- 把
内容的提问来源于stack exchange,提问作者lifeofthenoobie
相关产品推荐
相关产品推荐

