为什么要将Power BI模型的结果放到Excel中,因为在特定场景中,这种方法非常便捷。比如你需要制作一个个性化的展示在Excel中,但你的数据源可能很复杂,你需要在Excel中做很多复杂的计算过程,同时你又有一个可以被使用的Power BI模型,那么这个方法会非常合适。
适用范围
支持适用以下数据源
- Power BI(Pro)
- Excel Power Pivot
- SSAS
提示:如果使用的是Power BI Desktop,则需要购买Pro,发布到云端后才能使用。
Excel中的多维数据集函数
Excel中多维数据集函数在函数规则上是由MDX演化而来,虽然官网有函数的解释,但真正使用起来其实有一定的门槛,于是我花了一些时间研究。今天分享的是基于实际使用场景,我们需要掌握的一些用法。
在Excel中使用多维数据集函数的优缺点
优点
- 快速部署,满足各种个性化的表展示
- 免去了重新处理数据源的工作量,可以协同复用模型
缺点
- 计算效率比较慢,不适合太大规模的使用
- 需要使用环境支持,不是所有人都能快速上手
- 需要维度相对固定,无法自动拓展分类
提示:网速快的情况下有一定的提升效果
CUBEVALUE绝对引用
该函数使用场景非常多,可以直接从模型中取出想要的结果。通过不断的添加筛选条件和选择对应的度量值来满足取值需求。
=CUBEVALUE(
"你的Power BI模型",
"[日期表].[年份].[All].[2021]",
"[区域数据].[区域].[All].[北京大区]",
"[Measures].[销售额]"
)
CUBEVALUE相对引用
如果我们要根据Excel中已有的分类,进行动态的取值,将内容带入到多维数据集函数进行运算,则可以使用下面的方法:
//应用某个分类
=CUBEVALUE(
"你的模型",
"[日期表].[年份].[All].[2021]",
"[区域数据].[区域].[All].["&A1&"]",
"[Measures].[销售额]"
)
//引用某个日期
=CUBEVALUE(
"你的模型",
"[日期表].[日期].[All].["&TEXT( G2,"yyyy/m/d")&"]",
"[区域数据].[区域].[All].["&A1&"]",
"[Measures].[销售额]"
)
特别注意:如果引用了某个日期,在使用TEXT函数时,第二个参数要根据模型中显示的日期格式来对应的调整第二参数的表达.
比如模型中识别出来的日期是 2021/1/1,那么对应的就是"yyyy/m/d",而使用"yyyy/mm/dd"或"yyyy-m-d"或"yyyy-mm-dd"都是错误的。
这一步可以首先调出来一个正常的日期,观察它的格式,然后确定使用的参数。
辅助使用CUBESET多条件引用
在某些特定场景下,我们需要引用一个字段的多个分类,这个时候仅仅使用CUBEVALUE无法完成计算,需要使用CUBESET参与计算。
如果有多个字段的筛选条件,只需要再添加一组大括号,在其中针对某个字段进行条件的筛选即可。
// CUBESET的用法1
CUBESET(
"你的模型",
"
(
{
[区域数据].[区域].[All].[北京大区],
[区域数据].[区域].[All].[华中大区]
},
{
[门店数据].[门店类型].[All].[直营],
[门店数据].[门店类型].[All].[加盟]
}
)
",
"筛选条件的元素集合" //可选参数,该参数为默认显示的名称,不写不影响计算结果。
)
使用CUBESETCOUNT辅助验证,则会返回4,则代表该元素集合总有4个值,然后将四个值带入到CUBEVALUE中即可。
=CUBEVALUE(
"你的Power BI模型",
A1, //该地址为CUBESET元素集合在Excel单元格的地址
"[Measures].[销售额]"
)
当然也可以把CUBESET直接嵌入到CUBEVALUE合并为一个公式来计算。
使用CUBESET筛选日期区间
大括号内的选择项目为并集,两个大括号之间形成交集。同时关于其中日期的调整,也可以在Excel中提前设置到需要取值的日期开始和结束时间,然后添加到公式中。具体请参考示例中的格式。
=CUBESET(
"你的模型",
"
(
{
[门店数据].[区域名称].[All].[北京大区],
[门店数据].[区域名称].[All].[华中大区]
},
{
[日期表].[日期编码].[20210101]: [日期表].[日期编码].[20210131],
[日期表].[日期编码].[20190101]: [日期表].[日期编码].[20190131]
}
)
",
"区域名称",
0 //排序方式,默认可以不用写
)
将该结果作为CUBEVALUE的参数,即可完成计算。
使用CUBESET筛选日期时,是无法直接对日期列进行作用的,因此需要在模型的日期表添加一列日期的编码,将日期转换为日期编码。
//根据日期表的日期列,快速转换日期编码的DAX语句
=YEAR('日期表'[日期] ) * 10000 + MONTH( '日期表'[日期] ) * 100 + DAY( '日期表'[日期] )
使用Excel名称管理器简化公式
Excel的公式编辑器,最高上限是255个字符。由于多维数据集函数的特殊写法,很容易造成编写超出规定字符的问题,此时可以使用Excel名称管理器功能进行简化。具体使用方法,请查阅相关内容。
=CUBESET(
"你的模型",
_筛选条件,
"区域名称",
0
)
实际上是将一段大筛选条件封装到名称管理器中,为了方便区分,建议在前面加上 _ 以示区别,这样在Excel公式中,就会变得非常简洁。
注意:不能只将引号内的部分作为名称管理器的引用部分,因为不能被识别。
//名称管理器:_筛选条件
//引用位置是下面的内容,包括引号
"
(
{
[门店数据].[区域名称].[All].[北京大区],
[门店数据].[区域名称].[All].[华中大区]
},
{
[日期表].[日期编码].[20210101]: [日期表].[日期编码].[20210131],
[日期表].[日期编码].[20190101]: [日期表].[日期编码].[20190131]
}
)
"
其中的日期部分依然可以在名称管理器中引用Excel的单元格,如果是从Excel单元格中传递分类,比如区域,那么建议是保留这部分在多维数据集的公式中编写。
=CUBESET(
"你的模型",
_筛选条件,
"[产品等级].[产品等级名称].[ALL].["&A1&"]",
"区域名称",
0
)
最后将相关的条件嵌入到CUBEVALUE公式中即可完成计算。
总结
基于以上内容,还需要大家多多尝试多多总结。