【前述:根据微软Power BI排期,原本只能在SSAS 2019中使用的DAX特性–CalulationGroup,将在今年的Desktop中发布。本文将围绕CalulationGroup,言简意赅的讲解它的概念,以及它在PBI报表中具体是如何被应用的,能为我们带来什么。】
众所周知,近期国内疫情严重,宅在家里,工作要做,游戏要玩,但对BI技术的探索也不能少。偶然想起半年前Macro Russo大师曾发表数篇关于CalulationGroup的介绍性文章,但当时本人除了Power BI以外,SSAS也只装了2012和2017两个版本,不便亲自实践,只能在理论意义上理解CalulationGroup,现在有时间折腾了,就在个人电脑中又装了一个SQL Server 2019,以SSAS表格模型作为后端,Power BI作为前端来实际体验一下CalulationGroup。
概念
关于CalulationGroup,中文译为“计算组",也称”度量值组",在Macro的此篇文章中有很好的介绍,推荐阅读,本文在概念上仅简明介绍关于它的几个核心知识点:
- CalulationGroup是一个表,这意味着它同样可以在DAX公式中被引用;它包含一列或两列,第一列即实际意义上的"度量值组",列中的值由多个度量值组成;第二列为可选列,用于对度量值组进行排序。
- 度量值组中的值,即度量值本身被成为CalulationItem(计算项),它本身代表的是一个上下文环境。SELECTEDMEASURE()函数接受度量值作为参数,在特定计算项的上下文环境中执行计算。
- 计算项默认对所有度量值有效,但你可以使用ISSELECTEDMEASURE()或SELECTEDMEASURENAME()对计算项的应用范围做出限制,使之仅对特定度量值有效。
- 允许创建多个度量值组,但必须设定优先级,以使引擎能够理解特定度量值在不同度量值组之下的计算项上下文环境中的计算顺序(如X+1和X * 2, 是先加1还是先乘2,需要设置清楚)。在SSAS中,优先级参数为Precedence, 该值越大,优先级越高。
- 同一个度量值组中,只能有一个计算项被激活,这是可以理解的,因为在同一个度量值组中,不同计算项不存在优先级关系,一旦多个计算项被同时应用,引擎无法理解哪个计算项被优先应用。
此外,还有一个名为SELECTEDMEASUREFORMATSTRING()的函数,它代表当前度量值的格式字符串,我们暂时无法了解未来CalulationGroup在Power BI中是如何使用的,但在SSAS中,你可以为每个计算项使用DAX表达式来设定其格式字符串。
应用
首先介绍本文使用微软官方提供的AdventureWork2017作为数据源进行建模,主要表格关系如下示&