SUMMARIZECOLUMNS
傳回一組群組的摘要資料表。
語法
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。