PowerBI DAX 如何使用变量表里的列

2021-09-17 10:41:09 浏览数 (1)

大部分人都会在进入 Power BI 的学习后对这个问题感到不适,看看你是不是也是一样的。

很多时候,我们可能需要使用变量表中的列,例如:

代码语言:javascript复制
VAR vTable = FILTER( 'Order' , [Discount] <> 0 )

这里定义了一个 vTable 表示订单中没有折扣的那些订单。

进一步地,我们想对这个表求和,可能会这样写:

代码语言:javascript复制
VAR vResult = SUM( vTable[LineSellout] )

这里是希望表达计算销售额,但会遭遇一个语法错误,这里不能使用 vTable[LineSellout]

解决方案

表,在 DAX 分为模型表以及非模型表。

直接加载到 DAX 数据模型的就是模型表,又称为:基表(base table)。

用 VAR 定义的表,的确是一个表,但这个表,并不是数据模型中的表,也就不是基表。

如果希望使用基表中列,可以使用这样的语法:

代码语言:javascript复制
表[列]

因此,

代码语言:javascript复制
VAR vResult = SUM( 'Order'[LineSellout] )

是有效的正确语法,而

代码语言:javascript复制
VAR vResult = SUM( vTable[LineSellout] )

是无效的错误语法。

如果希望使用非基表中的列,则不可以直接引用到,要结合具体的场景来选择合适的函数。

聚合运算

如果希望直接进行聚合运算,则:

代码语言:javascript复制
VAR vResult = SUMX( vTable , [LineSellout] )

这里的 vTable 作为表使用,而 [LineSellout] 作为其中的列被引用到。

取出某列

如果想直接取出某列,也必须注意使用的方式,例如,错误的方式如下:

代码语言:javascript复制
VAR vList = VALUES( vTable[LineSellout] )

这就是一个错误的语法,因为 vTable[LineSellout] 并不是合理的引用。

正确的做法如下:

代码语言:javascript复制
VAR vList = SELECTCOLUMNS( vTable , "LineSellout" , [LineSellout] )

这样就可以返回其中某个列作为的表。

更多的思考

首先,关于表与基表的问题,在此前的文章中有深刻的讨论,可以参考。

其次,要强调一个问题,或者一个思考,那就是:

既然 VALUESDISTINCTCOUNT 都不能使用到诸如 vTable[LineSellout] 的列,那么,是不是存在某个场景,是无法实现表达的?

这一思考,是本质的,对于一套公式语言来说,这考察了该语言的完备性,如果存在这种情况,则是 DAX 的缺失和必须弥补的问题了。

幸好,这种情况是不存在的,对此问题的理论讨论会更复杂,也会枯燥,这里不再展开。对于大家而言,我们只要记住:DAX 很强,很成熟,很好用,都可以实现即可。

0 人点赞