共用方式為


SUMMARIZECOLUMNS

適用於:計算結果列匯出數據表量值視覺計算

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

語法

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

參數

詞彙 定義
groupBy_columnName 對基底資料表的完整資料行參考 (Table[Column]),所傳回資料表中包含了基底資料表的相異值。 每個 groupBy_columnName 資料行會與後續指定資料行交叉聯結 (不同資料表),或自動存在 (相同資料表)。
filterTable 資料表運算式,這個運算式會新增至指定為 groupBy_columnName 引數的所有資料行篩選內容。 篩選資料表中出現的值,用來在執行交叉聯結/自動存在之前進行篩選。
NAME 字串,其代表要用於後續指定運算式的資料行名稱。
expression 傳回單一值 (而非資料表) 的任何 DAX 運算式。

傳回值

資料表,其包含來自所提供資料行的值組合 (根據指定的群組)。 傳回的資料表中所包含資料列,僅限於至少其中一個所提供運算式傳回非空白值的資料列。 如果所有運算式針對某個資料列都評估為空白/Null,則該資料列不會包含在傳回的資料表中。

備註

  • 此函式不保證結果的任何排序次序。

  • groupBy_columnName 參數中不能多次指定某個資料行。 例如,下列公式無效。

    SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )

  • 在計算結果欄或資料列層級安全性 (RLS) 規則中使用時,不支援在 DirectQuery 模式中使用此函式。

篩選內容

請考慮以下查詢:

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

在此查詢中,如果沒有量值,groupBy 資料行就不會包含來自 FILTER 運算式 (例如,來自 Customer 資料表) 的任何資料行。 篩選不會套用至 groupBy 資料行。 「銷售領域」和「客戶」資料表可能會透過「轉售商銷售」事實資料表而間接相關。 因為不是直接相關,所以篩選運算式不會有任何作用,且 groupBy 資料行不會受到影響。

不過,使用此查詢:

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

groupBy 資料行會包含受篩選影響的資料行,且該篩選會套用至 groupBy 結果。

使用 IGNORE

IGNORE 語法可以藉由省略空白/Null 評估中的特定運算式,而用來修改 SUMMARIZECOLUMNS 函式的行為。 對於不使用 IGNORE 而使所有運算式傳回空白/Null 的資料列,將會予以排除,而不論使用 IGNORE 的運算式是否評估為空白/Null。 IGNORE 只能用在 SUMMARIZECOLUMNS 運算式內。

範例

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Total Qty", 
    IGNORE( SUM( Sales[Qty] ) ), 
    "BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 ) 
)

這會彙總 Sales[CustomerId] 資料行,並會為指定群組中的所有客戶建立小計。 如果沒有 IGNORE,則結果會是:

CustomerId 總數量 BlankIfTotalQtyIsNot3
A 5
B 3 3
C 3 3

使用 IGNORE

CustomerId 總數量 BlankIfTotalQtyIsNot3
B 3 3
C 3 3

忽略所有運算式,

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Blank", 
    IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5", 
    IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) ) 
)

雖然兩個運算式針對部分資料列傳回空白,但因為沒有傳回空白的非忽略運算式,所以包含在內。

CustomerId Blank BlankIfTotalQtyIsNot5
A 5
B
C

使用 NONVISUAL

NONVISUAL 函式會將 SUMMARIZECOLUMNS 函式中的值篩選標記為不影響量值,但僅適用於分組依據資料行。 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] 是所有年份的總計:

DimDate[CalendarYear] [Sales] [Visual Total Sales]
2007 9,791,060.30 29,358,677.22
2008 9,770,899.74 29,358,677.22

相反地,沒有 NONVISUAL 函式的相同查詢:

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 語法,其會藉由根據 groupBy_columnName 資料行將彙總/小計資料列新增至結果來修改 SUMMARIZECOUMNS 函式的行為。 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] ) 
)

銷售額會依州/省、依日期分類,小計為 1。 依州/省的銷售額 (依日期 2)。 依州/省的銷售額 (依客戶 3)。 將客戶和前置日期都彙總到依州/省的銷售額。

傳回下列資料表,

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 只能用在 SUMMARIZECOLUMNS 或 SUMMARIZE 運算式內。

具有多個小計的範例

SUMMARIZECOLUMNS( 
    ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ), 
    ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] ) 
)

仍依城市和州/省分組,但在報告傳回下列資料表的小計時一起彙總,

州/省 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

內容摘要

背景

在 2023 年 2 月之前,SUMMARIZECOLUMNS 完全不支援在內容轉換內進行評估。 在當月之前發行的產品中,這項限制使得 SUMMARIZECOLUMNS 在大部分量值中都無效,因此在任何內容轉換的情況下,都無法呼叫 MEASURE SUMMARIZECOLUMNS,包括其他 SUMMARIZECOLUMNS 語句。

從 2023 年 2 月起,在少數案例中支援內容轉換,但並非所有情況下都支持轉換。 支援和受限制的案例如下:

SummarizeColumns 類型 具有單一數據行的外部篩選 具有多個數據行的外部篩選 外部 GroupBy 資料行
SummarizeColumns with GroupBy only [確定] [確定] [確定]
SummarizeColumns 搭配篩選/量值 確定 錯誤 錯誤

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

SummarizeColumns 類型 具有單一數據行的外部篩選 具有多個數據行的外部篩選 外部 GroupBy 資料行
SummarizeColumns with GroupBy only [確定] [確定] [確定]
SummarizeColumns 搭配篩選/量值 [確定] [確定] [確定]

不過,此更新也包含 SummarizeColumns 行為的變更,這可能會改變現有表達式的結果:

外部篩選的 SelfValue 語意

我們引進了名為 SelfValue 的語意概念,這會改變來自外部數據表的篩選如何與 SummarizeColumns 中的 GroupBy 數據行互動。 這項變更不允許來自不同數據表的篩選,以影響 GroupBy 數據行,即使數據表是透過依篩選關聯性相關也一樣。 說明此變更影響的範例包含下列表達式:

CalculateTable(
  SummarizeColumns(
      'Reseller Sales'[ResellerKey], 
      'Reseller Sales'[ProductKey]
  ), 
  Treatas({(229)}, 'Product'[Product Key])
)

在此更新之前,TreatAs 篩選條件會套用至 SummarizeColumns 內的 GroupBy 作業,並利用 'Product'[Product Key] 與 'Reseller Sales'[ProductKey] 之間的關聯性。 因此,查詢結果只會包含 『Reseller Sales』[ProductKey] 等於 229 的數據列。 不過,在更新之後,SummarizeColumns 內的 GroupBy 數據行將不再依外部數據表的數據行進行篩選,即使它們之間存在關聯性也一樣。 因此,在上述範例中,GroupBy 數據行 'Reseller Sales'[ProductKey] 不會依 'Product'[ProductKey] 數據行篩選。 因此,查詢會包含 『Reseller Sales』[ProductKey] 不等於 229 的數據列。

如果您想要保留先前的行為,您可以使用 Summarize 來重寫運算式,而不是 SummarizeColumns,如下所示:

CalculateTable(
    SUMMARIZE(
        'Reseller Sales',
        [ResellerKey],
        [ProductKey]
    ),
    Treatas({(229)}, 'Product'[Product Key])
)

這個重寫的表達式會保留原始語意,其中 GroupBy 作業不受更新引進的 SelfValue 限制影響。

Treatas 完整涵蓋 groupby 數據行的數據列驗證

在此更新之前,在 SummarizeColumns 函式中,如果來自特定數據表的所有 GroupBy 數據行全都由同一個數據表的單一 Treatas 篩選所涵蓋,如下所示:

SummarizeColumns(
  Geography[Country], 
  Geography[State], 
  Treatas(
      {("United States", "Alberta")}, 
      Geography[Country], 
      Geography[State]
  )
)

上述查詢的結果會包含 Treatas 篩選中指定的任何數據列,不論它們是否有效。 例如,即使 'Geography' 數據表中沒有具有 [Country] = “美國” 和 [State] = “Alberta” 的數據列,結果也會是單一數據列數據表(“美國”、“Alberta”。

此問題已知且已由更新解決。 更新之後,會將這類無效的數據列篩選掉,而且只會傳回 GroupBy 數據表的有效數據列。 因此,上述查詢的結果會是空的,因為 'Geography' 數據表中沒有符合指定 [Country] 和 [State] 值的有效數據列。

不允許相同數據表/叢集上的混合 Keepfilters/overriddefilters

最近的更新引進了暫時性限制,可觸發錯誤訊息,指出:

"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的篩選條件都存在於相同的數據表/叢集內時,就會發生此錯誤。 例如:

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' 數據表上有兩個篩選:一個具有指定的 KeepFilters,另一個沒有 。 這些篩選條件會與不同數據行上的外部篩選重疊。 目前不允許此設定,因為在內部,這兩個篩選會叢集成一個,而且系統無法判斷整體叢集篩選的正確篩選覆寫行為。

請注意,這項限制是暫時性的。 我們正積極開發解決方案,在未來的更新中移除這項限制。 如果您遇到此錯誤,建議您視需要新增或移除 KeepFilters,以調整 SummarizeColumns 內的篩選,以確保每個數據表的覆寫行為一致。

SUMMARIZE