很多时候,我们可能需要使用变量表中的列,例如:
代码语言: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] )
这样就可以返回其中某个列作为的表。
更多的思考
首先,关于表与基表的问题,在此前的文章中有深刻的讨论,可以参考。
其次,要强调一个问题,或者一个思考,那就是:
既然 VALUES
和 DISTINCTCOUNT
都不能使用到诸如 vTable[LineSellout]
的列,那么,是不是存在某个场景,是无法实现表达的?
这一思考,是本质的,对于一套公式语言来说,这考察了该语言的完备性,如果存在这种情况,则是 DAX 的缺失和必须弥补的问题了。
幸好,这种情况是不存在的,对此问题的理论讨论会更复杂,也会枯燥,这里不再展开。对于大家而言,我们只要记住:DAX 很强,很成熟,很好用,都可以实现即可。