为PowerBI报告中的表格添加行号是一个很常见的需求,但并不容易实现,之前可以通过添加排名来变相实现,不过相对较为麻烦,并且上下文变动,DAX也得相应修改。现在有了可视化计算,解决这个问题就变得很简单。
Power BI中有个窗口函数ROWNUMBER,它的功能是返回当前上下文在指定分区内按指定顺序排序的唯一级别,可以实现行号的效果,它不是专属的可视化计算函数,度量值中也可以使用。
这个函数的语法看起来较为复杂,它的参数如下:
虽然作为正常的DAX函数,
RO
WN
UMB
ER
较为复杂,不过它在可视化计算中使用非常简单。
下面以
PowerBI星球案例模型
制作的这个表格为例,来看看它是如何添加行号的。
添加可视化计算,只需要输入:
这个行号就添加好了,
它的所有参数都是可选的,可全部省略,默认以当前上下文字段的文本来排列的。
因为可视化计算的结果默认保留2位小数,而行号应该是整数来显示,可以在可视化计算中套个FORMAT函数,让它不显示小数:
返回到表格,还可以将可视化计算的字段拖拽到最上方,这样就显示到最左侧,看起来更像是我们日常见到的表格序号了。
无论产品名称是按升序还是降序排列,序号始终从上到下从1开始按顺序排列:
并且添加一个字段。它会自动适应上下文,比如把城市放进来,序号依然是从上到下依次排列的:
即使改成按城市升降排序,依然有行号的效果:
这样添加行号是不是非常方便呢?
但是如果按照销售额来排序,这个行号就错乱了:
那么如何实现按销售额来正确排列呢?
这样的效果就需要用到ROWNUMBER函数中的ORDERBY参数了,可视化计算的公式可以这样改
(主要看变量No_的写法,后面的FORMAT只是为了设置格式不显示小数)
:
VAR No_=
ROWNUMBER( ROWS , ORDERBY([销售额],ASC) )
效果如下:
上面是升序排列,如果销售额最大的序号为1,就是降序排列,将上面ORDERBY中的ASC改成DESC就可以了。
如果是有层级的表格,比如一个矩阵,行标题中有产品类别和产品名称两个层级,用上面不带任何参数的ROWNUMBER函数也可以实现行号的效果:
如果想在层级内添加行号,比如在每个产品类别内,生成从1开始的序号,就要用到ROWNUMBER函数的重置参数:
VAR No_=
ROWNUMBER( ROWS , LOWESTPARENT )
效果如下:
这个重置参数只能用于可视化计算,并且目前重置参数与ORDERBY不能结合,也就是上面的写法无法加上ORDERBY,在产品类别内按销售额排序。
如果想实现按类别进行销售额排序的效果,可以使用传统写法,利用非专属于可视化计算的partitionBy参数。
ALLSELECTED([产品类别],[产品名称]),
就可以实现在产品类别内按销售额排序了:
这种传统写法是不是看起来更复杂、更难以理解呢?
实际上它也可以直接写成度量值:
ALLSELECTED('产品表'[产品类别],'产品表'[产品名称]),
放到矩阵里是同样的效果:
以上就是利用ROWNUMBER来添加行号的用法,可视化计算的方式要更简洁,更易于理解,不过功能上也有不完善之处。
目前关于可视化计算的介绍仅仅是针对目前版本的功能,如果后续发布的版本功能有调整,这里也会及时更新。