PowerBI/DAX之理解SUMMARIZECOLUMNS函数

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原理,没法独立来介绍。但是说简单却也很简单,因为这个函数其实可以看成是一个函数化的矩阵。

其中,分组列参数可以看成是矩阵的行标签,表筛选器参数可以看成是切片器提供的筛选,然后派生列可以看成是矩阵值字段中的度量值。

比如下图所示的切片器与矩阵:

然后,可以在性能分析器中查看该矩阵的底层查询,如下图所示:

其精简后的底层查询为:

从上面的查询中可以看到,矩阵的行标签字段对应的是分组列参数,切片器提供的筛选对应的是表筛选器参数,然后度量值对应的是派生列参数。

再比如以下卡片图的场景,如下图所示:

其对应的底层查询为:

image-20250630163635750

由于卡片图自身不会提供上下文,因此对应的SUMMARIZECOLUMNS函数就不需要分组列参数。其中,切片器提供的筛选对应的是表筛选器参数,然后卡片图的度量值对应的是派生列参数。

经过上面两个场景的对比,相信都能够掌握SUMMARIZECOLUMNS函数的用法,将其看成是一个函数化的矩阵即可,只要是矩阵有的特性,那它都会有。


总结

SUMMARIZECOLUMNS函数看似很复杂,但其实我们一直都在学习和使用它,只不过以前是用界面化的矩阵视觉对象来代替而已。

### Power BI 中 SUMMARIZECOLUMNS 函数的语法和用法 #### 一、SUMMARIZECOLUMNS 函数简介 `SUMMARIZECOLUMNS` 是一种用于创建汇总表的强大 DAX 函数。它可以基于一组列生成聚合数据,并支持通过 `ROLLUP` 和 `ROLLUPGROUP` 来定义分层结构的小计功能。 其主要用途是在不需要物理建模的情况下动态生成表格视图,适用于复杂的数据分析场景[^1]。 --- #### 二、SUMMARIZECOLUMNS 函数的语法 以下是 `SUMMARIZECOLUMNS` 的标准语法: ```dax SUMMARIZECOLUMNS( [<GroupBy_ColumnName1> [, <GroupBy_ColumnName2>, …]], [<FilterTable1>], [<Expression1>] [, <Expression2>, …] ) ``` - **参数说明**: - `<GroupBy_ColumnName>`:指定要分组的一系列列名。 - `<FilterTable>`:可选参数,用于过滤输入数据集的一个或多个表表达式。 - `<Expression>`:一个或多个聚合表达式,通常由聚合函数(如 `SUM`, `AVERAGE`, `COUNT` 等)组成。 --- #### 三、SUMMARIZECOLUMNS 示例 ##### 示例 1:基本用法 假设有一个销售表 `Sales`,其中包含以下字段:`Region`, `ProductCategory`, `SalesAmount`。我们希望按地区和地区内的产品类别汇总销售额。 ```dax SUMMARIZECOLUMNS ( 'Sales'[Region], // 按 Region 分组 'Sales'[ProductCategory], // 按 ProductCategory 进一步细分 FILTER ( // 添加筛选条件 ALL('Sales'), 'Sales'[Year] = 2023 // 只考虑 2023 年的数据 ), "Total Sales", SUM(Sales[SalesAmount]) // 计算总销售额 ) ``` 此查询会返回一张二维表,显示每个地区的每种产品类别的总销售额[^1]。 --- ##### 示例 2:带 ROLLUP 功能 如果需要在上述基础上增加小计,则可以通过 `ROLLUP` 实现。 ```dax SUMMARIZECOLUMNS ( ROLLUP ('Sales'[Region], 'Sales'[ProductCategory]), FILTER ( ALL('Sales'), 'Sales'[Year] = 2023 ), "Total Sales", SUM(Sales[SalesAmount]) ) ``` 在此示例中,`ROLLUP` 将自动为 `Region` 和 `ProductCategory` 提供总计以及各级子总计。 --- ##### 示例 3:跨多张表的联合汇总 当涉及多张关联表时,也可以轻松实现复杂的汇总逻辑。例如,假设有两张表:`Date` 和 `Sales`,它们之间存在关系。我们可以这样写: ```dax SUMMARIZECOLUMNS ( 'Date'[Year], // 按年份分组 'Date'[Month], // 按月份进一步细化 FILTER ( // 应用日期范围筛选器 ALL('Date'), 'Date'[DateKey] >= DATE(2023, 1, 1) && 'Date'[DateKey] <= DATE(2023, 12, 31) ), "Total Units Sold", SUM(Sales[UnitSold]) // 统计售出单位数量 ) ``` 该语句将生成一份年度和月度维度上的销量统计报表[^1]。 --- #### 四、注意事项 1. **性能优化**:由于 `SUMMARIZECOLUMNS` 不依赖于模型中的现有关系,因此可能会带来额外的计算开销。建议仅在必要时使用。 2. **上下文转换**:与 `CALCULATE` 类似,在执行过程中会发生行到筛选器上下文的转换[^2]。 3. **ROLLUP 使用限制**:正如引用提到的那样,`ROLLUP` 需要在 `SUMMARIZECOLUMNS` 内部调用才能生效[^1]。 --- #### 五、参考资料扩展阅读 对于更深入的学习,《DAX权威指南》是一本非常值得推荐的经典书籍,能够帮助理解高级概念并提升实际应用能力[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值