上市公司的财报通常包含如下格式的表格。这个表格的困难之处在于,项目之间不是独立存在的,有些项目是由别的项目加减计算得到的。例如毛利等于收入减销售成本。 Excel有很大的灵活性,插入行就可以搞定这样的表格,Power BI则不然。
摘自港交所某上市公司报表
Power BI的表格格式不灵活,不意味着实现不了。以下是实现结果:
也不意味着数据源需要重构复杂结构,基础数据还是这么简单:
那么,这是如何办到的?
这里我们巧妙利用了矩阵的总计栏进行中间过程展示,窗口函数进行上下滚动计算。
首先对数据源新增三个辅助列,计算分组列用于确定当前科目需要计算的下一个指标的名称,例如收入和成本后续需要计算毛利,分组就确定为毛利。
除了最终结果(本例为期内溢利)没有下一级需要计算的指标则分组直接填写当前科目,例如所得税开支。
对科目和计算分组都添加索引进行按列排序。这种数据结构可外部导入,也可SWITCH函数生成计算列。
新建如下四个度量值:
M.当前数据 = SUM('表'[值])
M.累计数据 =
CALCULATE (
[M.当前数据],
WINDOW (0, ABS, 0, REL, ALLSELECTED ( '表'[计算分组],'表'[计算分组索引],'表'[科目], '表'[科目索引] ), ORDERBY ('表'[科目索引] ))
)
M.使用值 = IF (HASONEVALUE('表'[科目]),[M.当前数据],[M.累计数据])
M.科目名称 = SELECTEDVALUE('表'[科目],SELECTEDVALUE('表'[计算分组],"期内溢利"))
当前数据和累计数据为中间计算过程,展示层使用的是M.使用值度量值,当科目存在唯一值是返回当前值,否则进行滚动计算返回累计值。
矩阵如下拖拽字段:
我们得到了下图这样的表格,向左拖拽隐藏维度的科目列,显示度量值的科目,施工完成。
不同公司、不同交易所可能报表结构有所差异,设计思路都可以借鉴。如果对SVG比较了解,还可以在矩阵嵌入瀑布图,展示更直观: