共用方式為


SUMMARIZECOLUMNS

適用於:導出數據行計算數據表Measure視覺計算

傳回一組群組的摘要資料表。

語法

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

參數

詞彙 定義
groupBy_columnName 傳回數據表中包含相異 values 之基表的完整數據行參考 (Table[Column])。 每個groupBy_columnName數據行都會與後續指定的數據行交叉聯結(不同數據表)or 自動存在(相同數據表)。
filterTable 數據表表達式,這個表達式會新增至指定為groupBy_columnName自變數之 all 數據行的 filter 內容。 在執行交叉聯結/自動存在之前,filter 數據表中的 values 會用來 filter。
name 字串,其代表要用於後續指定運算式的資料行名稱。
expression 傳回單一 value 的任何 DAX 表示式(not 數據表)。

傳回 value

數據表,其中包含根據指定的群組,從提供的數據行 values 組合。 只有至少一個提供表達式傳回非blankvalue 的數據列才會包含在傳回的數據表中。 If all 表示式 evaluateBLANK數據列的 /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 數據行。 Sales Territory and Customer 數據表可透過轉銷商銷售 fact 數據表間接 related。 由於 not 直接 related,所以 filter 表示式是 no-op andgroupBy 數據行 not 受到影響。

不過,使用此查詢:

SUMMARIZECOLUMNS ( 
    'Sales Territory'[Category], 'Customer' [Education], 
    FILTER('Customer', 'Customer'[First Name] = "Alicia") 
)

groupBy 資料行包含受 filter 套用至 groupBy 結果 filterand 影響的數據行。

使用 IGNORE

IGNORE 語法可用來修改 SUMMARIZECOLUMNS 函式的行為,方法是省略 BLANK/NULL 評估的特定運算式。 使用 IGNORE 傳回 /NULL 傳回 BLANKnot 表示式的數據列,與使用 IGNOREevaluateBLANK/NULL ornot的表達式無關。 all 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 標示 not 為影響 measurevalues,但只適用於 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] [Sales] [Visual Total Sales]
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]

傳回結果,其中 [Visual Total Sales] 是兩個選定年份的總計:

DimDate[CalendarYear] [Sales] [Visual Total Sales]
2007 9,791,060.30 19,561,960.04
2008 9,770,899.74 19,561,960.04

使用 ROLLUPADDISSUBTOTAL

加入 ROLLUPADDISSUBTOTAL 語法會修改 SUMMARIZECOLUMNS 函式的行為,方法是根據groupBy_columnName數據行,將 rollup/subtotal 數據列新增至結果。 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]

傳回下列資料表,

類別 子類別 IsCategorySubtotal IsSubcategorySubtotal 總數量
True True 60398
配件 False True 36092
配件 Bike Racks False False 328
Bikes Mountain 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 7/11/2014
C FALSE OR 2 2014/7/10
C FALSE OR 1 7/11/2014
TRUE WA 6 2014/7/10
TRUE WA 2 7/11/2014
TRUE OR 2 2014/7/10
TRUE OR 1 7/11/2014
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 總數量 City 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 有用,在任何內容轉換的情況下,not 呼叫 measureSUMMARIZECOLUMNS,包括其他 SUMMARIZECOLUMNSstatements。

從 2023 年 2 月起,在少數案例中支援內容轉換,但在 all 條件中 not。 支援的受限制案例 and 如下所示:

SummarizeColumns 類型 具有單一數據行的外部 Filter 具有多個數據行的外部 Filter 外部 GroupBy 數據行
僅限 GroupBySummarizeColumns [確定] [確定] [確定]
使用 Filters/Measure SummarizeColumns [確定] ERROR ERROR

從 2024 年 6 月起,我們會啟用內容相關 SummarizeColumns,允許在任何內容轉換中評估 SummarizeColumns,measure 中的 SummarizeColumnsnow 完全支援:

SummarizeColumns 類型 具有單一數據行的外部 Filter 具有多個數據行的外部 Filter 外部 GroupBy 數據行
僅限 GroupBySummarizeColumns [確定] [確定] [確定]
使用 Filters/Measure SummarizeColumns [確定] [確定] [確定]

不過,此更新也包含 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] 將會依 'Product'[ProductKey] 數據行篩選 not。 因此,查詢會包含 『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。 例如,結果會是單一數據列數據表 (“United States”, “Alberta”),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." 

當一般 filters(覆寫現有 filters)andfilters 指定 KeepFilters 位於相同數據表/叢集內時,就會發生此 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