SUMMARIZECOLUMNS
返回一组组的摘要表。
语法
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
parameters
术语 | 定义 |
---|---|
groupBy_columnName |
对基表的完全限定列引用(Table[Column]),返回的表中包括非重复 values。 每个groupBy_columnName列是交叉联接的(不同表),or 自动存在的(同一表)与后续指定的列。 |
filterTable |
添加到指定为groupBy_columnName参数的 all 列的 filter 上下文中的表表达式。 在执行交叉联接/自动存在之前,filter 表中存在的 values 用于 filter。 |
name |
表示要用于指定的后续表达式的列名称的字符串。 |
expression |
返回单个 value 的任何 DAX 表达式(not 表)。 |
返回 value
一个表,其中包含根据指定的分组从提供的列 values 的组合。 只有至少一个提供的表达式返回非blankvalue 的行才会包含在返回的表中。 If all 表达式 evaluate 为行 BLANK/NULL,该行 not 包含在返回的表中。
备注
此函数 not 保证结果的任何排序顺序。
不能在 groupBy_columnName 参数中多次指定某一列。 例如,下面的公式无效。
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
在计算列 or 行级别安全性 (RLS) 规则中使用时,not 支持在 DirectQuery 模式下使用此函数。
Filter 上下文
请考虑下列查询:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
在此查询中,如果没有 measuregroupBy 列,则 not 包含 FILTER 表达式中的任何列(例如,来自 Customer 表)。 filter not 应用于 groupBy 列。 销售区域 and 客户表可以通过经销商销售 fact 表间接 related。 由于它们直接 relatednot,因此 filter 表达式是 no-op andgroupBy 列 not 受影响。
但是,对于以下查询:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
groupBy 列包含受 filter 应用于 groupBy 结果的 filterand 影响的列。
使用 IGNORE
IGNORE 语法可用于通过省略 BLANK/NULL 计算中的特定表达式来修改 SUMMARIZECOLUMNS 函数的行为。 使用 IGNORE 返回 BLANK/NULL 的 all 表达式 not 的行将独立于使用 IGNOREevaluateBLANK/NULL ornot的表达式排除。 IGNORE 只能在 SUMMARIZECOLUMNS 表达式中使用。
示例
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
这会汇总 Sales[CustomerId] 列,为给定分组中的 all 客户创建分类汇总。 如果没有 IGNORE,结果为:
CustomerId | 总数量 | BlankIfTotalQtyIsNot3 |
---|---|---|
A | 5 | |
B | 3 | 3 |
C | 3 | 3 |
使用 IGNORE,
CustomerId | 总数量 | BlankIfTotalQtyIsNot3 |
---|---|---|
B | 3 | 3 |
C | 3 | 3 |
All 表达式被忽略,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Even 尽管这两个表达式都为某些行返回 blank,但会包含这些表达式,因为没有返回 blank的无对齐表达式。
CustomerId | Blank | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
使用 NONVISUAL
NONVISUAL 函数将 SUMMARIZECOLUMNS 函数中的 valuefilter 标记为影响 measurevalues的 not,但仅适用于 groupBy 列。 NONVISUAL 只能在 SUMMARIZECOLUMNS 表达式中使用。
示例
DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
DimDate[CalendarYear],
NONVISUAL(TREATAS({2007, 2008}, DimDate[CalendarYear])),
"Sales", [Sales],
"Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]
返回结果,其中 [Visual Total Sales] 是 all 年的总销售额:
DimDate[CalendarYear] | [销售额] | [直观总销售额] |
---|---|---|
2007 | 9,791,060.30 | 29,358,677.22 |
2008 | 9,770,899.74 | 29,358,677.22 |
相比之下,没有
DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
DimDate[CalendarYear],
TREATAS({2007, 2008}, DimDate[CalendarYear]),
"Sales", [Sales],
"Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]
返回结果,其中 [直观总销售额] 是两个选定年份的总计:
DimDate[CalendarYear] | [销售额] | [直观总销售额] |
---|---|---|
2007 | 9,791,060.30 | 19,561,960.04 |
2008 | 9,770,899.74 | 19,561,960.04 |
使用 ROLLUPADDISSUBTOTAL
添加 ROLLUPADDISSUBTOTAL 语法通过基于groupBy_columnName列将 rollup/subtotal 行添加到结果中来修改 SUMMARIZECOLUMNS 函数的行为。 ROLLUPADDISSUBTOTAL 只能在 SUMMARIZECOLUMNS 表达式中使用。
有单个小计的示例
DEFINE
VAR vCategoryFilter =
TREATAS({"Accessories", "Clothing"}, Product[Category])
VAR vSubcategoryFilter =
TREATAS({"Bike Racks", "Mountain Bikes"}, Product[Subcategory])
EVALUATE
SUMMARIZECOLUMNS
(
ROLLUPADDISSUBTOTAL
(
Product[Category], "IsCategorySubtotal", vCategoryFilter,
Product[Subcategory], "IsSubcategorySubtotal", vSubcategoryFilter
),
"Total Qty", SUM(Sales[Qty])
)
ORDER BY
[IsCategorySubtotal] DESC, [Category],
[IsSubcategorySubtotal] DESC, [Subcategory]
返回下表,
类别 | Subcategory | IsCategorySubtotal | IsSubcategorySubtotal | 总数量 |
---|---|---|---|---|
True | True | 60398 | ||
Accessories | False | True | 36092 | |
Accessories | 自行车车架 | False | False | 328 |
Bikes | 山地自行车 | False | False | 4970 |
Clothing | False | True | 9101 |
有多个小计的示例
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
销售额按状态、按客户、date分组,分类汇总为 1。 按状态、date 2 的销售额。 按州省/自治区/直辖市、按客户所得销售额 3. 汇总了两个客户 anddate 导致按州销售。
返回下表,
CustomerID | IsCustomerSubtotal | 状态 | 总数量 | Date | IsDateSubtotal |
---|---|---|---|---|---|
A | FALSE |
WA | 5 | 2014/7/10 | |
B | FALSE |
WA | 1 | 2014/7/10 | |
B | FALSE |
WA | 2 | 2014/7/11 | |
C | FALSE |
OR | 2 | 2014/7/10 | |
C | FALSE |
OR | 1 | 2014/7/11 | |
TRUE |
WA | 6 | 2014/7/10 | ||
TRUE |
WA | 2 | 2014/7/11 | ||
TRUE |
OR | 2 | 2014/7/10 | ||
TRUE |
OR | 1 | 2014/7/11 | ||
A | FALSE |
WA | 5 | TRUE |
|
B | FALSE |
WA | 3 | TRUE |
|
C | FALSE |
OR | 3 | TRUE |
|
TRUE |
WA | 8 | TRUE |
||
TRUE |
OR | 3 | TRUE |
使用 ROLLUPGROUP
与 SUMMARIZE 函数一样,ROLLUPGROUP 可以与 ROLLUPADDISSUBTOTAL 一起使用,以指定要包含的摘要组/粒度(分类汇总),从而减少返回的分类汇总行数。 ROLLUPGROUP 只能在 SUMMARIZECOLUMNSorSUMMARIZE 表达式中使用。
有多个小计的示例
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
仍按城市 and 州分组,但在报告分类汇总时汇总返回下表,
状态 | CustomerId | IsCustomerSubtotal | 总数量 | 城市 | IsCityStateSubtotal |
---|---|---|---|---|---|
WA | A | FALSE |
2 | Bellevue | FALSE |
WA | B | FALSE |
2 | Bellevue | FALSE |
WA | A | FALSE |
3 | Redmond | FALSE |
WA | B | FALSE |
1 | Redmond | FALSE |
OR | C | FALSE |
3 | Portland | FALSE |
WA | TRUE |
4 | Bellevue | FALSE |
|
WA | TRUE |
4 | Redmond | FALSE |
|
OR | TRUE |
3 | Portland | FALSE |
|
A | FALSE |
5 | FALSE |
||
B | FALSE |
3 | TRUE |
||
C | FALSE |
3 | TRUE |
||
TRUE |
11 | TRUE |
上下文 SummarizeColumns
背景
直到 2023 年 2 月,SUMMARIZECOLUMNS 在 all的上下文转换中 not 支持评估。 在 month之前发布的产品中,这种限制在大多数措施中都 SUMMARIZECOLUMNSnot 有用——在任何上下文转换(包括其他 SUMMARIZECOLUMNSstatements)的情况下,都 not 调用 measureSUMMARIZECOLUMNS。
从 2023 年 2 月开始,在一些方案中支持上下文转换,但在 all 条件 not。 受支持的 and 受限案例如下所示:
SummarizeColumns 类型 | 具有单列的外部 Filter | 具有多个列的外部 Filter | 外部 GroupBy 列 |
---|---|---|---|
仅使用 GroupBySummarizeColumns | OK | OK | OK |
使用 Filters/Measures SummarizeColumns | OK | ERROR | ERROR |
从 2024 年 6 月开始,我们将启用上下文 SummarizeColumns,允许在任何上下文转换中评估 SummarizeColumns,measure 中的 SummarizeColumnsnow 完全支持:
SummarizeColumns 类型 | 具有单列的外部 Filter | 具有多个列的外部 Filter | 外部 GroupBy 列 |
---|---|---|---|
仅使用 GroupBySummarizeColumns | OK | OK | OK |
使用 Filters/Measures SummarizeColumns | OK | OK | OK |
但是,此更新还包括对 SummarizeColumns行为的更改,这可能会更改现有表达式的结果:
外部 filters 的 SelfValue 语义
我们引入了一个名为 SelfValue 的语义概念,它改变了从外部表 filters 如何与 SummarizeColumns中的 GroupBy 列进行交互。 此更改禁止从其他表 filters,以影响 GroupBy 列,evenif 表通过 filter关系 related。 演示此更改影响的一个示例涉及以下表达式:
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
在此更新之前,TreatAsfilter 将应用于 SummarizeColumns内的 GroupBy 操作,利用“Product”[Product 密钥]and“Reseller Sales”[ProductKey] 之间的关系。 因此,查询结果将仅包含 'Reseller Sales'[ProductKey] 等于 229 的行。 但是,更新后,GroupBySummarizeColumns 中的列将不再按外部表中的列进行筛选,evenif 它们之间存在关系。 因此,在上面的示例中,GroupBy 列“Reseller Sales”[ProductKey] 将 not 按“Product[ProductKey]”列筛选。 因此,查询将包含“Reseller Sales”[ProductKey] not 等于 229 的行。
If 你希望保留 previous 行为,可以使用 Summarize 而不是 SummarizeColumns重写表达式,如下所示:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
此重写表达式保留原始语义,其中 GroupBy 操作 not 受更新引入的 SelfValue 限制的影响。
Treatas 完全涵盖 groupby 列的行验证
在此更新之前,在 SummarizeColumns 函数中,特定表中的 ifallGroupBy 列完全由同一表中的单个 Treatasfilter 所覆盖,如下所示:
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
上述查询的结果将包括 Treatasfilter中指定的任何行,无论它们是否有效 ornot。 例如,结果为单行表(“美国”、“艾伯塔”),evenif “Country] = ”United States“ and [State] = ”Alberta“ 存在于”Geography“表中。
此更新解决了此问题 and。 更新后,将筛选出此类无效行,and 仅返回 GroupBy 表中的有效行。 因此,上述查询的结果将为空,因为“Geography”表中没有与指定的 [Country] and [State] values 匹配的有效行。
禁止同一表/群集上的混合 Keepfilters/overriddefilters
最近的更新引入了一个临时限制,用于触发 error 消息,指出:
"SummarizeColumns filters with keepfilters behavior and overridefilters behavior are mixed within one cluster, which is not allowed. Consider adding keepfilters() to all filters of summarizecolumns."
当同一个表/群集中存在指定 KeepFilters 的正常 filters(替代现有 filters)andfilters 时,会发生此 error。 例如:
Evaluate CalculateTable(
SummarizeColumns(
Product[Color],
KeepFilters(
TreatAs(
{( "Washington")}
, Geography[State]
)
),
TreatAs(
{("United States"), ("Canada")}
, Geography[Country]
)
)
,TreatAs({("Alberta")}, Geography[State])
,TreatAs({("Canada")}, Geography[Country])
)
在上述表达式中,“Geography”表中有两个 filters:一个 KeepFilters 指定 and 一个没有。 这些 filters 与不同列上的外部 filters 重叠。 目前,not 允许此配置,因为在内部,这两个 filters 聚集成一个,and 系统无法确定群集 filter 在此类情况下整体上的正确 filter 重写行为。
请注意,此限制是暂时性的。 我们正在积极开发解决方案,以便在将来的更新中消除此限制。 If 遇到此 error,我们建议通过根据需要添加 or 删除 KeepFilters 来调整 SummarizeColumns 内的 filters,以确保对每个表执行一致的重写行为。