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 內的篩選,以確保每個數據表的覆寫行為一致。