SUMMARIZECOLUMNS

适用于:计算列计算表Measure视觉计算

返回一组组的摘要表。

语法

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,以确保对每个表执行一致的重写行为。

SUMMARIZE