这章节中,我们学习了许多关于上下文的理论概念。现在是时候使用它们去解决一些有趣的场景,并且学习一个很有用的功能——使用参数表。
使用参数表的方法是,我们建立一个表格,这个表和模型中的其他表都不关联,但是我们在DAX表达式中使用它并改变表达式的结果。使用一个案例可能有助于我们学习。设想一下,你建立了一个报表,里面有销售额,因为公司销售了很多商品,所以报表中显示的销售额数字就非常大。因为数据库是使用销售额列,所以数据库不会有这样的影响,但是把通过聚合这些数字,最后的度量值就非常大了,这个场景在实际中也非常常见。如下图:
image.png这个报表的问题就是数字太大,难以阅读。非常难以辨认具体是多少,另外,占用了太多的报表空间,也并没有提供更多的信息量。通常的处理方式办法是,对于这样的报表,我们使用不同的计量单位。例如,我们可能要求把数字除以1000或者10000,这样结果的数字就小很多了,也同样能提供相同的信息。
要解决这个问题问题,我们只要修改一下代码,把数字除以1000。这里唯一的问题是,你可能想根据实际遇到的数值,来判断除以1000或者10000.如果我们要建立多个度量值,也可以解决,但是这个看来很多余,我们要建立一个更好的方法来解决这个问题。
解决的思路是使用一个切片器,让用户自己去选择使用的数量级。如下图,我们可以看到我们希望的解决方法。
image.png有意思的地方是,这里我们使用ShowValueAs切片器不是要过滤数字,而是要改变报表数字的数量级。当用户选了Real Value,报表显示实际值。如果选择了1000,那么显示实际数值除以1000,边改的同时,报表的格局没有改变。对于其他的数量级显示单位也是这样。
要建立这样的报表,第一件要做的事情就是需要建立一个表,包含了需要的数量级数值,这个用于切片器。我们的案例中,用Excel制作这个表格。当一个更专业的方法是,使用数据库表来存储。如下图:
image.png很显然,这个表不能和其他表格建立任何关系,因为这个表没有任何列可以和其他表关联。但是,一旦这个表格添加到了数据模型中,你就可以使用表格的列作为切片器的数据源。这样,你就有了一个仅用于切片器的数据,然后DAX代码就会根据用户的选择然后修改表格的内容。
这个DAX的表达可以按如下的写法:
[ScaledSalesAmount] :=
IF (
HASONEVALUE ( Scale[DivideBy] ),
DIVIDE ( [Sales Amount], VALUES ( Scale[DivideBy] ) ),
[Sales Amount]
)
这里有两个值得注意的地方:
我们使用了if函数来判断条件:hasonevalue(scale[showvalueas])。这个写法我们应该很熟悉了,我们检查scale表是否只有一个值被选择,如果用户没有选择任何选项,列中的所有值都会显示,也就是hasonevalue返回false(因为有多个不同值被选择了)。如果相反,用户只选择了一个值,那么只有一个被显示,hasonevalue就返回了true。所以,这个函数的意思就是:判断用户是否只选择了一个值。
如果一个值被选择了,那么也就是只有一个行被选择了。因此,我们可以使用values(scale[divideby])函数,我们也可以知道返回的值就是一行一列的。DAX会把一行一列的表通过values函数转换为数值。如果你用values()去计算一个多行的表,那么系统会报错。不过,在这个特别的案例中,我们可以确认返回的就是一个单一值,因为我们前面已经用if函数判断过了。
因此,这个表达式可以这样理解:如果用户在切片器选择了一个值,那么就显示对应的数量级的数值,否则就显示原始的值。这样就得到一个表格,可以根据切片器的选择,互动的显示报表数值,切片器起了一个选择器的作用。因为报表都是使用了标准的DAX函数,所以报表可以部署到sharepoint或则powerbi中。
参数表对于建立报表非常有用。这个案例非常简单,但是非常常见,唯一的限制是你的想象力。你可以通过参数表调整计算的数值,去改变显示的文字或者用于调整计算用的DAX函数代码。
----------------------------------------(第四章 完结)----------------------------------------------
网友评论