SUMMARIZECOLUMNS
傳回一組群組的摘要資料表。
語法
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
參數
詞彙 | 定義 |
---|---|
groupBy_columnName |
傳回數據表中包含相異值的基表的完整數據行參考 (Table[Column])。 每個groupBy_columnName數據行都會與後續指定的數據行交叉聯結(不同數據表)或自動存在(相同數據表)。 |
filterTable |
數據表表達式,會新增至指定為groupBy_columnName自變數之所有數據行的篩選內容。 在執行交叉聯結/自動存在之前,篩選數據表中的值是用來篩選。 |
name |
字串,其代表要用於後續指定運算式的資料行名稱。 |
expression |
傳回單一值(而非數據表)的任何 DAX 表達式。 |
傳回值
數據表,其中包含根據指定的群組,從提供之數據行的值組合。 只有至少一個提供表達式傳回非空白值的數據列才會包含在傳回的數據表中。 如果所有數據列的表達式都評估為 BLANK/NULL,該數據列就不會包含在傳回的數據表中。
備註
此函式不保證結果的任何排序順序。
groupBy_columnName 參數中不能多次指定某個資料行。 例如,下列公式無效。
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
在匯出數據行或數據列層級安全性 (RLS) 規則中使用時,不支援在 DirectQuery 模式中使用此函式。
篩選內容
請考慮以下查詢:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
在此查詢中,如果沒有量值,groupBy 資料行就不會包含來自 FILTER 表達式的任何數據行(例如,來自 Customer 數據表)。 篩選不會套用至 groupBy 數據行。 Sales Territory 和 Customer 資料表可透過 Reseller 銷售事實數據表間接相關。 由於它們不直接相關,所以篩選表達式是 no-op,而且 groupBy 數據行不會受到影響。
不過,使用此查詢:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
groupBy 數據行包含受篩選影響的數據行,並將該篩選套用至 groupBy 結果。
使用 IGNORE
IGNORE 語法可用來修改 SUMMARIZECOLUMNS 函式的行為,方法是省略 BLANK/NULL 評估的特定運算式。 不使用 IGNORE 傳 BLANK回 /NULL 的所有運算式都會排除的數據列,不論使用 IGNORE 評估的表達式是否 BLANK/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 | 空白 | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
使用 NONVISUAL
NONVISUAL 函式會將 SUMMARIZECOLUMNS 函式中的值篩選標示為不會影響量值,但只會套用至 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] 是所有年份的總和:
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數據行,將匯總/小計數據列新增至結果。 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 | 總數量 |
---|---|---|---|---|
真 | 真 | 60398 | ||
配件 | 假 | 真 | 36092 | |
配件 | Bike Racks | 假 | 假 | 328 |
Bikes | Mountain Bikes | 假 | 假 | 4970 |
Clothing | 假 | 真 | 9101 |
具有多個小計的範例
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
依狀態、依客戶、日期分組銷售,小計為 1。 依狀態的銷售額,依日期 2。 依州/省的銷售額 (依客戶 3)。 依狀態匯總到客戶和日期。
傳回下列資料表,
CustomerID | IsCustomerSubtotal | 州/省 | 總數量 | 日期 | 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 沒有用處,在任何內容轉換的情況下,都不可能呼叫量值 SUMMARIZECOLUMNS,包括其他 SUMMARIZECOLUMNS 語句。
從 2023 年 2 月起,在少數案例中支援內容轉換,但並非所有情況下都支持轉換。 支援和受限制的案例如下:
SummarizeColumns 類型 | 具有單一數據行的外部篩選 | 具有多個數據行的外部篩選 | 外部 GroupBy 資料行 |
---|---|---|---|
SummarizeColumns with GroupBy only | [確定] | [確定] | [確定] |
SummarizeColumns 搭配篩選/量值 | [確定] | ERROR | ERROR |
從 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] = “United States” 和 [State] = “Alberta” 的數據列,結果也會是單一數據列數據表 (“United States”、“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 內的篩選,以確保每個數據表的覆寫行為一致。