本文提供了PowerBI处理非结构化数据的新思路,单张表构建多维度的复杂报告;
本文提供的方法配合流数据集可以实现无限刷新、实时更新的复杂报告;
甲方爸爸的要求
有这么一个场景:
甲方提供了一个带数据的PowerBI模型,只有一张表:
要求只有一个:
不允许对数据做任何修改,不允许新建表、新建列、修改数据格式、按列排序等操作,也不允许设置自动日期智能:
也就是说,对于这个模型,只能写度量值,然后在报告中呈现,不能有任何其他操作。要求最终呈现结果:
本来很简单的一个事,添加一个日期表,2分钟搞定,为啥要这么麻烦呢?
甲方嘛,咱也不敢说,咱也不敢问。
收人钱财替人消灾
很明显这个数据表跟我们之前接触的表很不同,因为它并不是结构化的。这张表单看前三列是结构化的销售记录表:
单看后5列也是结构化的日期表:
但是放在一起这是什么操作?
面对这么无理合情合理的要求,我们先拖个表看看情况吧:
嗨,连看也不用看,肯定不对,不能这么直接来筛选。
我们来拆解一下:
首先拖个年月序号:
数据表本质上是前三列,它一定不能被这个年月序号直接筛选,所以写度量值的时候一定要ALL掉。
后面的日期表中包含了所有销售日期,因此我们可以用日期列去匹配数据表的签单日期,从而获得每一天的销售额,然后相加就是本月的销售记录:
我们直接写度量值:
代码语言:javascript复制sales.month =
//首先创建一个只包含日期列的表
var days_table=
ADDCOLUMNS(
VALUES('Table'[日期ID]),
"formate_day",
FORMAT('Table'[日期ID],"yyyy-mm-dd")
)
//然后添加列,计算每一天的sales
//这里在VAR中又加了一个var,为了在虚拟表中计算匹配日的sales
var sales_day=
ADDCOLUMNS(
days_table,
"sales",
var thisday=[formate_day]
return
CALCULATE(
[sales],
FILTER(
ALL('Table'),
FORMAT('Table'[签单时间],"yyyy-mm-dd")=thisday))
)
//累加求和
var sales_month=SUMX(sales_day,[sales])
return sales_month
拖入表中:
ok!
度量值其实并不是很难写。
只是我们很少会遇到这样的数据表,哪怕遇到这样的数据表,我们也不会遇到这样的要求。
那为什么学谦还要写这篇文章呢?
谁是甲方爸爸
正如昨天的文章中说的:
从Power Automate到Power BI实时流数据集:翻山越岭的问题解决
在流数据集中我们是没有办法对数据进行任何的修改,不允许新建表、新建列、修改数据格式、按列排序等操作,也不允许设置自动日期智能:
所以这个甲方爸爸正是:流数据集。
流数据集的优点非常强,在仪表板中能够实时显示数据,完全自动化刷新,可以解决大量的对于时间序列敏感的数据。
但是缺点也非常明显,那就是无法添加数据表获取信息以外的维度,尤其是绝大部分数据的日期同时包含了时间信息:
我们根本无法做到对于更大周期的比如日、周、月的数据分析与各种对比。
本文解决了这个问题。
无限刷新
甚至,我们继续往下想,一个拥有多张数据表、多张维度表的模型,我们完全可以将其合并为一张表,在不同列上显示。
然后通过以上的方式,构建出完全相同的模型。
不要忘了,这一切都是基于流数据集来实现。回想一下, 流数据集的优点:
实时更新!
自动刷新!