SUMMARIZECOLUMNS函数可以很方便的对数据进行透视聚合,并且其重要性很高,每个视觉对象所用到的数据在底层中其实都是使用这个函数来进行查询的。
语法和作用
语法:
SUMMARIZECOLUMNS ( <groupBy_columnName>[, <groupBy_columnName>]…, [<filterTable>]…[, <name>, <expression>]… )
作用:返回由分组列之间形成的笛卡尔积表,并可以往该表中添加派生列。
参数说明:
1、groupBy_columnName,用于分组的列,可以是任意列的引用
2、filterTable,添加到分组列参数的筛选上下文中的表筛选器
3、name,添加的派生列的列名
4、expression,添加的派生列的表达式,将在分组列提供的筛选上下文中计值
注意事项:
1、分组列之间总是产生笛卡尔积组合,但其中来自同一个表的两个及以上字段会触发Auto-Exists机制。
2、最终返回的结果会自动删除所有派生列结果都为空的行,也就是说派生列使用的表达式中至少有一个返回非空值的时候,其所在行才包括在结果表中。
3、该函数最好只用在查询中,因为它不支持由行上下文转换所提供的筛选上下文,然而大部分视觉对象的底层都涉及到行上下文转换,所以该函数不能用于绝大部分度量值中。
其中,第三点的限制已经在24年7月的更新中去除,该函数已经可以识别行上下文转换,并可以在行上下文中计算。但即便如此,还是建议仅在查询中使用该函数。
辅助理解的例子
这个函数说复杂也的确挺复杂的,它涉及到筛选器交互、Auto-Exists机制等许多DAX原理,没法独立来介绍。但是说简单却也很简单,因为这个函数其实可以看成是一个函数化的矩阵。
其中,分组列参数可以看成是矩阵的行标签,表筛选器参数可以看成是切片器提供的筛选,然后派生列可以看成是矩阵值字段中的度量值。
比如下图所示的切片器与矩阵:
然后,可以在性能分析器中查看该矩阵的底层查询,如下图所示:
其精简后的底层查询为:
从上面的查询中可以看到,矩阵的行标签字段对应的是分组列参数,切片器提供的筛选对应的是表筛选器参数,然后度量值对应的是派生列参数。
再比如以下卡片图的场景,如下图所示:
其对应的底层查询为:
由于卡片图自身不会提供上下文,因此对应的SUMMARIZECOLUMNS函数就不需要分组列参数。其中,切片器提供的筛选对应的是表筛选器参数,然后卡片图的度量值对应的是派生列参数。
经过上面两个场景的对比,相信都能够掌握SUMMARIZECOLUMNS函数的用法,将其看成是一个函数化的矩阵即可,只要是矩阵有的特性,那它都会有。
总结
SUMMARIZECOLUMNS函数看似很复杂,但其实我们一直都在学习和使用它,只不过以前是用界面化的矩阵视觉对象来代替而已。