使用表变量时DAX语法为何能引用原表名称?
我理解SUMMARIZE和AVERAGEX的使用逻辑,但困惑的是:AVERAGEX在迭代汇总后的CustomersAge表变量时,为何能引用Sales[Customer Age]而非我预想的[Customer Age]?请问该写法为何正确?表变量是否指向原表及列名?这是否是DAX使用表变量时的常规写法?
示例DAX代码:
Correct Average = VAR CustomersAge = SUMMARIZE ( -- Existing combinations Sales, -- that exist in Sales Sales[CustomerKey], -- of the customer key and Sales[Customer Age] -- the customer age ) RETURN AVERAGEX ( -- Iterate on list of CustomersAge, -- Customers/age in Sales Sales[Customer Age] -- and average the customer’s age )
问题解答
为什么引用Sales[Customer Age]是正确的?
因为用SUMMARIZE直接引用原表列(这里是Sales[Customer Age])生成表变量时,新表中的列并没有创建独立的新列,而是保留了原表列的身份引用。当AVERAGEX迭代CustomersAge时,当前行上下文里的Sales[Customer Age]就是该表中对应行的年龄值,和直接写[Customer Age]指向的是同一个值。表变量是否指向原表及列名?
是的。这种场景下,CustomersAge表中的Customer Age列本质上就是原表Sales的Customer Age列,只是被筛选成了Sales表中存在的客户键对应的年龄组合。DAX会识别这个列的原始归属,所以直接引用原表列名是有效的。这是否是DAX的常规写法?
属于常规写法,但不是唯一写法——你也可以直接写[Customer Age],结果完全一致。不过要注意:如果SUMMARIZE中是通过表达式生成的新列(比如写"Customer Age", MAX(Sales[Customer Age])这种命名新列的方式),那迭代时就必须用新列名,不能再引用原表列了。这种直接引用原表列的写法,是利用了DAX对列身份的追踪特性,在简单场景下可以简化代码。
内容的提问来源于stack exchange,提问作者Lars Kemmann

