什么样的叫中国式报表
正常的矩阵报表中,由行和例给成的交叉表,就两个维度,比如年份产品分类,一般制表是通过多个矩阵表实现不同维度的数据查看,如下图。
而中国式报表,可能在表头中不但要有年份,还要地区等其它维度,这在矩阵表中是无法直接实现的,直接放入两个维度到行字段的话,会根据模型关系,形成两个维度的上下层关系,而不是平行显示结果。
如何在Power BI中实现中国式报表
在Power BI中实现中国式报表的方法是为表头布局专门创建一个表,该表根据实际需要进行设计,将多个维度字段混合在一起,在制作图表的时候,表头使用这个新建立的表字段,度量计算的时候使用 Selectedvalue() 做维度筛选,根据筛选值再使用 TREATAS() 将该字段与实际维度表建立虚拟关系,以实现度量计算。实现的效果如下图。
上图表中,行是地区维度,列是产品类别和年份两个维度,这里主要需要解决表头的问题。
产品类别和年份并不是一个维度,而且,由于行字段使用的是专门为中国式报表建立的独特的表头,与在模型上与事实表并无关系,无法直接做度量计算,根据事实表与维度表已有的模型,按如下操作步骤,使用DAX实现非侵入式设计,以实现中国式复杂报表的制作。
Power BI中国式报表简单版实现步骤
第一步,建立混合表头(中国式报表表头)
将准备用在中国式报表表头的维度字段使用相关函数整合到一起,比如将时间维度的年份和产品维度的类别放到表头:
NewTable =
VAR t_Year = ADDCOLUMNS(SELECTCOLUMNS(VALUES('日期'[年份名称]),"表头名称",[年份名称]),"维度类型","Year")
VAR t_Catalog = ADDCOLUMNS(SELECTCOLUMNS(VALUES('产品'[类别]),"表头名称",[类别]),"维度类型","Catalog")
Return UNION(t_Year,t_Catalog)
第二步,建立计算度量值
以销售额为例,依照案例中的需求,地区和产品交叉筛选后计算、地区和年份交叉筛选后计算
在中国式报表中,行字段只有地区,直接使用维度表‘地区’中的字段即可,行字段涉及年份和产品类别两维度,前面已经专门建立了表做行字段 ,但该表与事实表之间并没有直接的关系,所以度量计算的时候需要使用到TREATAS() 函数建立关系,以实现度量计算。
SaleMeasure =
SWITCH(
TRUE(),
SELECTEDVALUE(NewTable[维度类型])="Year",
CALCULATE(SUM('订单'[销售额]),TREATAS(VALUES(NewTable[表头名称]),'日期'[年份名称]) ),
SELECTEDVALUE(NewTable[维度类型])="Catalog",
CALCULATE(SUM('订单'[销售额]),TREATAS(VALUES(NewTable[表头名称]),'产品'[类别]) )
)
总结
看起来很简单,只有两步,一步是自定义一个表头,一个是根据表头计算结果,但是并没有那么简单,一个是思路问题,一个是TREATAS() 这个平时很少用到的函数,也正是这个函数得以实现数据模型的无侵入设计。
新建的表头与事实并没关系,在不改动数据模型的情况下,将表头字段放到矩阵表行中,做表头,注意这里的表特意设计的,有多个维度,使用SELECTEDVALUE在确认当前维度,再使用TREATAS对第二级表头与维度建议虚拟关系,以实现最后的交叉计算。
这并没有结束,目前除去维度层,表头只有一级,而且由于多个维度的关系,最右侧的总计是空的,无法正常使用,需要进一步升级。
参考
- https://www.jianshu.com/p/c8770edeba77
- https://blog.csdn.net/qq_44794714/article/details/88833667