本人平常工作中利用PowerBI制作的报表是企业级的,意味着其权限非常重要,不同角色的人看到的数据是不一致的,这个需要严格限定的;由于是企业级的,所以报表中的KPI肯定不能覆盖所有部门的需求,即便一个企业级报表制作完成了,不同角色的人查看时,还可能需要根据自己部门的特色定制化一些分析指标,这个时候就需要一些明细数据,各部门再根据自己关心的指标去做分析或者报告,一种方案可以直接给一张大宽表,供各个角色的人去下载,然后再去汇总,但是如果powerbi能够将汇总的这一步做完,不更节省其他人的时间么?所以利用PowerBI生成一个可动态变化层级(动态变化维度)的一个表格就能解决上述问题了。
因为PowerBI并不原生支持动态层级变化,所以替代方案存在一些瑕疵,该方案最初来源于知乎文章:Power BI动态技巧:动态显示数据层级(链接见文末),但是在这里进行了一定的升级和变化,原方案做到了动态变化层级,但是不能向上汇总,还有一些细节方面的调整,瑕疵是在汇总情况下导出的表格多了一些空白列。
废话不多讲了,我们直接看一下案例,本案例只是讲解一下思路,还并未真正实践,如果碰到百万级或者千万级的数据,其性能是否严重下降,还有待验证。
在这里,我加入了权限,而且不破坏原数据模型,下图中蓝线以上是原模型中已有的筛选器和表格;下半部分就是动态的维度变化,当选择blank时得到数据就是在这个维度上的汇总数据(表2是在班级维度上的汇总,如一年级女生的成绩为333,与表1中的结果是一致的)

图1
我认为在本案例中有2点值得特别关注:
1.如何实现动态维度的变化,根据需要选择不同的维度形成想要的矩阵
2.如何在动态维度变化的同时能够汇总数据,即可以减少维度。
下面分别阐述这两点:
一、要想实现动态维度的变化,必须要再建立一张维度表(在PowerBI中不支持度量值做轴),能够达到以下这样的效果:
当我在切片器中点击某个维度时,该维度的值要在矩阵表中陈列出来,如下图:

图2
其后台的表格如下:

图3
这只是一个维度,如果有2个维度呢?最先想到的是把上面的表格再复制一份,如下图:

图4
但是当点击”+”展开矩阵的时候,会报一个错误:无法确定多个字段之间的关系,因为此时这两个表格之间并没有关系。当有了关系后,就能够知道每个维度的值所对应的原始数据中的行,这样动态维度就成了。
如何确定这两个表格之间的关系就成了动态维度变化的关键?

图5
一年级来说,它有4行记录:0,1,2,3,如果再加上班级,那么一年级一班所对应的数据就是0,1,这样的话,当只有年级的时候,应该按照所选择的年纪去计算0,1,2,3的汇总,当有年级和班级的时候,按照年级和班级的组合,汇总对应的数字下行记录即可。所以说,各个维度表中间的关系,就可以用0,1,2,3等等代替。
根据上面的分析,将前面提到的维度表再添加一列Index变成:
图6
如果我们通过Index将图5和图6进行关联,通过图6(维度表)中的一年级就能在图5(事实表)中找到其对应的记录,同理我们也可以对图4中的第二个维度进行改造,最后通过Index将两个动态维度与事实表关联,动态变化维度的模型就初步搭成了。
具体的做法就是用PowerBI中逆透视生成每个维度对应的行记录号即可。
二、在完成基本的动态维度变化后,如何能够汇总数据
在动态维度表中,加入如下blank值,当切片器中选中blank时,对应的维度值是同一个blank值,所以PowerBI会汇总,汇总的行数就是Index对应的行,本质上并没有将该维度删掉,所以在结果中会出现空白列,但这也是没有办法的办法了。

如果把以上两个关键点都解决了的话,那动态维度变化的表格就圆满了,可以达到随意的增减维度,而且满足数据权限

无维度

两个维度
以上的结果也有一定的美化空间,这里就不再介绍了
总结
要想实现动态变化维度,最关键的就是如何建立多维度表之间的关系,在本文中是通过在事实表中构建Index列,也就是Key键,要想实现随意增减维度,最关键的是理解维度增减的本质
资料下载:
回复关键字:动态维度,可获取下载链接
好了,我是BISeven,欢迎批评指正




