跳至主要内容

DAX SUMMARIZE():分组与汇总数据指南

DAX 中的 SUMMARIZE() 函数通过对数据进行分组并应用聚合函数来创建汇总表,可用于 Power BI 和 Excel Power Pivot 等工具。继续阅读,了解如何使用 DAX SUMMARIZE() 对数据进行分组与聚合并获得优质洞见。
· 9分钟 阅读

使用 AI 探索

别再被海量数据集困扰了。掌握 DAX SUMMARIZE() 函数的分组与聚合技巧,帮助您发现隐藏模式并做出更明智的决策。借助 DAX SUMMARIZE(),您可以在更大的数据集中创建一个“小报告”,自行选择按哪些信息分组、汇总哪些数值。它真的非常非常实用。

继续阅读,我将带您深入理解 DAX SUMMARIZE() 的细节,这样您就能在多种场景下高效使用它。如果您是 DAX 新手并想获取更多资源,也可以查看我们的 Power BI DAX 初学者教程 以获得更全面的认识。您也可以参加我们的 Introduction to DAX in Power BI 课程进行系统训练;课程既涵盖基础也包含更高级的技巧,适合各层级的专业人士。  

什么是 DAX 的 SUMMARIZE() 函数?

DAX 的 SUMMARIZE() 函数会根据您选择的列对数据进行分组,然后为每个分组计算总计或其他汇总值。

例如,假设您有一份包含产品、地区和销售额的大型销售数据清单。此时,您可以使用 SUMMARIZE() 按产品或地区对这些数据进行分组,并查看每个分组的总销售额。

您会在多款微软工具中用到 DAX,例如:

理解 SUMMARIZE() 后,您就能高效整理数据,制作更好的报告,并更深入地挖掘数据价值。所以,下次当您面对大型数据集并需要快速厘清时,使用 SUMMARIZE() 吧。

DAX SUMMARIZE() 与数据分组

下面是 SUMMARIZE() 如何基于指定的列和聚合创建汇总表:

SUMMARIZE (<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>, <expression>]…)

在上述语法中:

  • table 是您的数据源表。

  • groupBy_columnName 是您要用于分组的列。

  • name 是新计算列的名称。

  • expression 是您希望执行的计算。

您可以将 SUMMARIZE() 与数据集中任意表或列搭配使用,因此非常灵活。

基础分组

我们先看看使用 SUMMARIZE() 进行基础分组的简单示例。

首先,将数据集导入 Power BI。前往“主页”选项卡 > 获取数据,在下拉菜单中选择与已保存文件相对应的选项并加载。在本示例中,我的数据集包含Year、Product 和 SalesAmount 列。接下来我将其导入 Power BI。

需要用 DAX SUMMARIZE() 聚合的 Power BI 表格

名为 sales 的表。图片作者自制。

导入后,前往“建模”选项卡 > 新建表。然后输入以下公式,按 Year 列分组并聚合总销售额(Total Sales)。

	SummaryTable =
	SUMMARIZE(
	    sales,
	    sales[Year],
	    "Total Sales", SUM(sales[SalesAmount])
	)

在 Power BI 的公式栏中使用 SUMMARIZE() 函数

公式栏。图片作者自制。

在该公式中:

  • SummarizedTable 创建一个新表。

  • SUMMARIZE( 开始对数据进行分组与汇总。

  • SalesData, 是源表。

  • SalesData[Year], 按 Year 列分组。

  • "Total Sales", SUM(SalesData[SalesAmount]) 创建名为 Total Sales 的新列,汇总每年的 SalesAmount。

使用 DAX SUMMARIZE() 在 Power BI 中汇总总销售额

汇总结果。图片作者自制。

这里,SUMMARIZE() 函数通过按 Year 分组来创建汇总表,并通过对每年 SalesAmount 求和来计算 Total Sales。

多重分组

SUMMARIZE() 也能处理更复杂的分组。我们通过示例来理解。在这里,我有一个包含Year、Product、Region 和 SalesAmount 的数据集。

Power BI 中的销售数据表

名为 sales_data 的表。图片作者自制。

这里,我按 Year 和 Region 分组,计算每种组合的总销售额(Total Sales)。

	SummarizedTable =
	SUMMARIZE(
	    sales_data,
	    sales_data[Year],
	    sales_data[Region],
	    "Total Sales", SUM(sales_data[SalesAmount])
	)

该公式中:

  • sales_data 是存储数据的表。

  • sales_data[Year] 是按年份(Year)进行的第一列分组。

  • sales_data[Region] 是按地区进行的第二列分组。

  • "Total Sales" 是销售额求和的自定义列名。

  • SUM(SalesData[SalesAmount]) 对每个分组的销售额求和。

在 Power BI 中使用 DAX SUMMARIZE() 函数

多列分组的汇总。图片作者自制。

在这里,多重分组帮助我们同时从 Region 和 Year 两个维度来可视化销售趋势。从 2021 年到 2023 年,North 和 East 地区呈增长态势; South 在 2022 年销售额较高,而 West 仅有 2022–2023 年的数据。

DAX SUMMARIZE() 的高级技巧

虽然 SUMMARIZE() 很有用,但将其与其他 DAX 函数结合可以实现更复杂的分析能力。下面通过一些示例看看如何利用 SUMMARIZE() 完成复杂的聚合和汇总。

将 SUMMARIZE() 与 ROLLUP() 搭配使用

SUMMARIZE() 内的 ROLLUP() 功能会在汇总表中添加小计行,以展示不同分组层级的汇总,从而提供更详细的层级化摘要。如果您从事财务或相关分析工作,这对执行多层级聚合尤其有用。

  1. 在 SUMMARIZE() 中的分组列之后添加 ROLLUP() 关键字。

  2. 指定应包含在 ROLLUP() 计算中的列。

SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, ROLLUP(<groupBy_columnName>[,< groupBy_columnName>…])][, <name>, <expression>]…)

例如,此数据集展示了特定 Region 中每个 Product 的 Sales 和 Quantity。现在,我需要按 Region 和 Product 汇总销售额,包含小计与总计。

在 Power BI 中将 DAX SUMMARIZE() 与 ROLLUP() 搭配使用

名为 sales_rollup 的表。图片作者自制。

为此,我使用以下公式:

	SalesWithRollup =
	SUMMARIZE(
	    sales_rollup,
	    ROLLUP(sales_rollup[Region], sales_rollup[Product]),
	    "Total Sales", SUM(sales_rollup[Sales]),
	    "Total Quantity", SUM(sales_rollup[Quantity])
	)

在 Power BI 中将 SUMMARIZE() 与 ROLLUP() 搭配的 DAX 用法

使用 ROLLUP()。图片作者自制。

可以看到,SUMMARIZE() 按 Region 和 Product 分组,计算 Total Sales 和 Total Quantity。ROLLUP() 添加小计与总计行,为不同明细层级提供层级化的销售绩效摘要。

将 SUMMARIZE() 与 ADDCOLUMNS() 结合

您还可以用 ADDCOLUMNS() 扩展 SUMMARIZE(),在分组数据中加入自定义计算列。如果您希望在汇总表中添加度量或复杂计算,这会很有帮助。

例如,我继续使用相同数据集,这次通过以下公式新增一列:

	SalesWithAddColumns =
	ADDCOLUMNS(
	    SUMMARIZE(
	        sales_rollup,
	        sales_rollup[Region],
	        sales_rollup[Product],
	        "Total Sales", SUM(sales_rollup[Sales]),
	        "Total Quantity", SUM(sales_rollup[Quantity])
	    ),
	    "Average Sales per Unit",
	        DIVIDE(SUM(sales_rollup[Sales]), SUM(sales_rollup[Quantity]), 0)
	)

在 Power BI 中将 DAX SUMMARIZE() 与 ADDCOLUMNS() 搭配使用

结合使用 SUMMARIZE() 与 ADDCOLUMNS()。图片作者自制。

此处,SUMMARIZE() 按 Region 和 Product 分组并计算 Total Sales 和 Total Quantity。随后 ADDCOLUMNS() 通过将总销售额除以总数量计算每件平均销售额(Average Sales per Unit)。

常见 DAX 问题及解决方法

使用 SUMMARIZE() 时,您可能会遇到一些问题。但别担心,我们都经历过——我将带您了解常见挑战及应对方法。

避免结果含糊不清

有时 SUMMARIZE() 的结果可能看起来不太合理,通常是因为数据模型或关系不够清晰。以下做法可避免此类情况:

  1. 仔细检查数据模型: 确保各表之间连接正确。

  2. 使用清晰的列名: 避免在不同表中使用重复的列名。

  3. 指明表名: 引用列时包含表名(如 Orders[OrderDate])以避免混淆。

性能考量

尽管 SUMMARIZE() 很有帮助,但在处理大型数据集时可能会占用较多资源、拖慢速度。这意味着您的报告在刷新时可能会稍慢,尤其是在复杂度量或大量分组列的情况下。

以下技巧可帮助保持查询高效:

  • 考虑使用计算列: 对于经常使用的汇总,与其每次都用 SUMMARIZE(),不如创建计算列。

  • 移除不必要的列: 删除与分析无关的列,例如主键或可由其他列推导出的列。

  • 使用筛选器: 在汇总前将 DAX SUMMARIZE() 与 Filter() 搭配,减少需处理的数据量。

可替代 SUMMARIZE() 的 DAX 函数

虽然 SUMMARIZE() 很实用,但有时其他工具可能更合适。我们来看几个替代方案以及适用场景。

SUMMARIZECOLUMNS()

SUMMARIZECOLUMNS() 是另一个 DAX 函数,在处理大数据或复杂场景时更易于创建汇总表。它与 SUMMARIZE() 类似,但也有一些差异。

  • 可以直接在 SUMMARIZECOLUMNS() 中添加筛选器,从而更快。

  • 使用 SUMMARIZECOLUMNS() 可直接在输出中包含度量,无需像 ADDCOLUMNS() 这样的额外函数。

  • SUMMARIZECOLUMNS() 会自动处理空白行,您无需操心。

SUMMARIZECOLUMNS(
    <groupBy_columnName> [, <groubBy_columnName>] …, [<filterTable>] … [, <name>, <expression>] …
)

例如,我有一个数据集,希望按 Region 和 Department 汇总员工薪资,并筛选名字为Raven 的员工。我将使用 SUMMARIZECOLUMNS() 计算 Raven 在不同地区和部门的薪资总额。

在 Power BI 中使用 DAX 的 SUMMARIZE() 与 SUMMARIZECOLUMNS()

名为 employee_data 的表。图片作者自制。

为此,我使用以下公式:  

	SalarySummary =
	SUMMARIZECOLUMNS(
	    employee_data[Name],
	    employee_data[Region],
	    employee_data[Department],
	    FILTER(employee_data, employee_data[Name] = "Raven"),
	    "Total Salary", SUM(employee_data[Salary])
	)

在上述公式中:

  • SalarySummary 是所创建计算表的名称。

  • SUMMARIZECOLUMNS(...) 基于指定的列与计算创建汇总表。

  • employee_data[Name], employee_data[Region], employee_data[Department] 是用于分组的数据列。

  • FILTER(employee_data, employee_data[Name] = "Raven") 将结果限制为仅包含 Name 为Raven 的行。

  • "Total Salary", SUM(employee_data[Salary]) 在结果中创建一个计算列。

  • SUM(employee_data[Salary]) 计算每个分组的薪资总和。

在 Power BI 中使用 SUMMARIZECOLUMNS 作为 SUMMARIZE 的替代。

使用 SUMMARIZECOLUMNS 进行汇总。图片作者自制。

可以看到,SUMMARIZECOLUMNS() 在数据集中进行筛选,并计算 Raven 在不同地点与部门的薪资总额。

GROUPBY()

GROUPBY() 也是一个函数,当您只需对数据分组并对这些分组进行计算时,有时可替代 SUMMARIZE()。对于简单分组操作,它可能比 SUMMARIZE() 更高效。

与可跨关联表工作的 SUMMARIZE() 不同,GROUPBY() 专注于在单一表内分组与聚合,在某些场景下能提升性能。

让我们看一个示例。我需要创建一个库存数据集以跟踪商品、类别、销量与单价,然后按类别分组并计算各类别的总收入。

在 Power BI 中比较 DAX 的 SUMMARIZE() 与 GROUPBY()

库存表。图片作者自制。

为此,我使用以下公式:  

	SummaryGroupBY =
	GROUPBY(
	    Inventory,
	    Inventory[Category],
	    "Total Revenue",
	    SUMX(
	        CURRENTGROUP(),
	        Inventory[Units Sold] * Inventory[Unit Price]
	    )
	)

在上述公式中:

  • GROUPBY() 按 Category 分组数据。

  • CURRENTGROUP() 指代每个类别分组(例如电子产品、家具或家电)。

  • SUMX() 通过将 Units Sold 乘以 Unit Price 来计算每个分组的总收入。

在 Power BI 中使用 GROUPBY() 对数据进行分组

使用 GROUPBY 对数据分组。图片作者自制。 

可以看到,GROUPBY() 可以轻松通过将 Units Sold 乘以 Unit Price,并汇总这些单项收入,来计算总收入(Total Revenue)。

关于 DAX SUMMARIZE() 的总结

现在,您已经了解 DAX 中的 SUMMARIZE() 如何帮助您在 Power BI、Excel 等工具中对数据进行分组与分析。从基础分组到 ROLLUP()、ADDCOLUMNS() 等高级技巧,SUMMARIZE() 都能帮助创建有洞见的汇总。

熟能生巧,不妨用您自己的数据练习这些技巧,看看它们如何帮助您挖掘有用见解。如果您想进一步打磨 DAX 技能,欢迎报名我们的 Introduction to DAX in Power BI 课程,成为真正的高阶用户。 

Laiba Siddiqui

作者

Laiba Siddiqui

我是内容策略专家,热衷于将复杂主题化繁为简。我曾帮助 Splunk、Hackernoon 和 Tiiny Host 等公司为其受众打造兼具吸引力与信息量的内容。

DAX Summarize() 常见问答

SUMMARIZE() 是否区分大小写?

DAX 通常不区分大小写,因此在 SUMMARIZE() 中使用的列名不需要与原始数据的大小写完全一致。

使用 SUMMARIZE() 时常见错误有哪些?

常见错误包括语法错误、列名不存在,以及在大型数据集上的性能问题。为避免这些问题,请务必仔细检查函数参数与数据模型。

在上下文方面,SUMMARIZE() 和 SUMMARIZECOLUMNS() 有何不同?

SUMMARIZE() 在聚合时同时保留行上下文与筛选上下文,而 SUMMARIZECOLUMNS() 仅具有筛选上下文。

主题