SUMMARIZECOLUMNS
グループのセットに対するサマリー テーブルを返します。
構文
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
パラメーター
用語 | 定義 |
---|---|
groupBy_columnName |
返されるテーブルに個別の値が含まれるベース テーブルへの完全修飾列参照 (Table[Column])。 各groupBy_columnName列は、後続の指定された列とクロス結合 (異なるテーブル) または自動存在 (同じテーブル) です。 |
filterTable |
groupBy_columnName引数として指定されたすべての列のフィルター コンテキストに追加されるテーブル式。 クロス結合/自動存在が実行される前に、フィルター テーブルに存在する値をフィルター処理に使用します。 |
name |
指定した後続の式に使用する列名を表す文字列。 |
expression |
(テーブルではなく) 1 つの値を返す任意の DAX 式。 |
戻り値
指定されたグループに基づいて、指定された列の値の組み合わせを含むテーブル。 返されるテーブルには、指定された式の少なくとも 1 つが空白以外の値を返す行のみが含まれます。 すべての式が行 BLANK/NULL と評価された場合、その行は返されるテーブルに含まれません。
解説
この関数は、結果の並べ替え順序を保証しません。
groupBy_columnName パラメーターでは、1 つの列を複数回指定することはできません。 たとえば、次の式は無効です。
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/NULL 評価から特定の式を省略することで、BLANK 関数の動作を変更できます。 IGNORE を使用していないすべての式が /NULL BLANK返す行は、使用する式が /NULL BLANK評価されるかどうかに関係なく除外 IGNORE。 IGNORE は、SUMMARIZECOLUMNS 式内でのみ使用できます。
例
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
これにより Sales[CustomerId] 列がロールアップされ、特定のグループ内のすべての顧客の小計が作成されます。 IGNOREがないと、結果は次のようになります。
CustomerId | Total Qty | BlankIfTotalQtyIsNot3 |
---|---|---|
A | 5 | |
B | 3 | 3 |
C | 3 | 3 |
IGNOREを使用して、
CustomerId | Total Qty | 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] が 2 つの選択した年の合計となる結果が返されます。
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列に基づいてロールアップ/小計行が結果に追加され、SUMMARIZECOLUMNS 関数の動作が変更されます。 ROLLUPADDISSUBTOTAL は、SUMMARIZECOLUMNS 式内でのみ使用できます。
小計が 1 つの例
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 | Total Qty |
---|---|---|---|---|
真 | 真 | 60398 | ||
Accessories | 偽 | 真 | 36092 | |
Accessories | バイク ラック | 偽 | 偽 | 328 |
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 | State | Total Qty | 日付 | IsDateSubtotal |
---|---|---|---|---|---|
A | FALSE |
WA | 5 | 2014/7/10 | |
B | FALSE |
WA | 1 | 2014/7/10 | |
B | FALSE |
WA | 2 | 2014/7/11 | |
C | FALSE |
OR | 2 | 2014/7/10 | |
C | FALSE |
OR | 1 | 2014/7/11 | |
TRUE |
WA | 6 | 2014/7/10 | ||
TRUE |
WA | 2 | 2014/7/11 | ||
TRUE |
OR | 2 | 2014/7/10 | ||
TRUE |
OR | 1 | 2014/7/11 | ||
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] )
)
引き続き City と State でグループ化されていますが、小計を報告すると次の表が返されます。
State | CustomerId | IsCustomerSubtotal | Total Qty | City | IsCityStateSubtotal |
---|---|---|---|---|---|
WA | A | FALSE |
2 | ベルビュー | FALSE |
WA | B | FALSE |
2 | ベルビュー | FALSE |
WA | A | FALSE |
3 | レドモンド | FALSE |
WA | B | FALSE |
1 | レドモンド | FALSE |
OR | C | FALSE |
3 | Portland | FALSE |
WA | TRUE |
4 | ベルビュー | FALSE |
|
WA | TRUE |
4 | レドモンド | FALSE |
|
OR | TRUE |
3 | Portland | FALSE |
|
A | FALSE |
5 | FALSE |
||
B | FALSE |
3 | TRUE |
||
C | FALSE |
3 | TRUE |
||
TRUE |
11 | TRUE |
Contextual SummarizeColumns
背景
2023 年 2 月まで、SUMMARIZECOLUMNS はコンテキスト遷移内での評価をまったくサポートしませんでした。 その月より前にリリースされた製品では、この制限 SUMMARIZECOLUMNS ほとんどのメジャーでは役に立ちません。他の SUMMARIZECOLUMNS ステートメントを含め、コンテキスト遷移のいずれの場合もメジャー SUMMARIZECOLUMNS を呼び出すことはできません。
2023 年 2 月から、コンテキストの移行はいくつかのシナリオでサポートされていましたが、すべての条件ではサポートされていませんでした。 サポートされるケースと制限されたケースは次のとおりです。
SummarizeColumns 型 | 1 列の外部フィルター | 複数の列を含む外部フィルター | 外部 GroupBy 列 |
---|---|---|---|
GroupBy のみの SummarizeColumns | OK | OK | OK |
SummarizeColumns with Filters/Measures | OK | ERROR | ERROR |
2024 年 6 月から、コンテキスト遷移で SummarizeColumns を評価できるようにするコンテキスト SummarizeColumns を有効にしています。Measure の SummarizeColumns は完全にサポートされるようになりました。
SummarizeColumns 型 | 1 列の外部フィルター | 複数の列を含む外部フィルター | 外部 GroupBy 列 |
---|---|---|---|
GroupBy のみの SummarizeColumns | OK | OK | OK |
SummarizeColumns with Filters/Measures | OK | OK | OK |
ただし、この更新プログラムには SummarizeColumns の動作の変更も含まれています。これにより、既存の式の結果が変更される可能性があります。
外部フィルターの SelfValue セマンティクス
ここでは、外部テーブルからのフィルターが SummarizeColumns の GroupBy 列と対話する方法を変更する SelfValue というセマンティック概念を導入しています。 この変更により、テーブルがフィルターバイ リレーションシップを介して関連付けられている場合でも、別のテーブルからのフィルターが GroupBy 列に影響を与えるのを禁止します。 この変更の影響を示す例には、次の式が含まれます。
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
この更新プログラムの前に、TreatAs フィルターは SummarizeColumns 内の GroupBy 操作に適用され、'Product'[プロダクト キー] と 'Reseller Sales'[ProductKey] の間のリレーションシップが利用されます。 その結果、クエリ結果には、'Reseller Sales'[ProductKey] が 229 の行のみが含まれていました。 ただし、更新後、SummarizeColumns 内の GroupBy 列は、外部テーブル間にリレーションシップが存在する場合でも、外部テーブルの列によってフィルター処理されなくなります。 したがって、上の例では、GroupBy 列 'Reseller Sales'[ProductKey] は 'Product'[ProductKey] 列でフィルター処理されません。 その結果、クエリには、'Reseller Sales'[ProductKey] が 229 に等しくない行が含まれます。
前の動作を保持する場合は、次に示すように SummarizeColumns ではなく Summarize を使用して式を書き直すことができます。
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
この書き換えられた式は、GroupBy 操作が更新によって導入された SelfValue 制限の影響を受けなかった元のセマンティクスを保持します。
Treatas で完全にカバーされる groupby 列の行検証
この更新の前に、SummarizeColumns 関数内で、次に示すように、特定のテーブルのすべての GroupBy 列がその同じテーブルの 1 つの Treatas フィルターで完全にカバーされていた場合。
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
上記のクエリの結果には、有効かどうかに関係なく、Treatas フィルターで指定された行が含まれます。 たとえば、"Geography" テーブルに [Country] = "United States" と [State] = "Alberta" が存在する行がない場合でも、結果は 1 行のテーブル ("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' テーブルには 2 つのフィルターがあります。1 つは KeepFilters を指定し、もう 1 つは指定しません。 これらのフィルターは、異なる列の外部フィルターと重複しています。 現時点では、この構成は許可されていません。内部的には 2 つのフィルターが 1 つにクラスター化されており、このような場合は、クラスター化されたフィルター全体の適切なフィルターオーバーライド動作をシステムが判断できません。
この制限は一時的であることに注意してください。 Microsoft は、今後の更新プログラムでこの制限を取り除くソリューションの開発に取り組んでいます。 このエラーが発生した場合は、必要に応じて KeepFilter を追加または削除して SummarizeColumns 内のフィルターを調整し、各テーブルで一貫したオーバーライド動作を確保することをお勧めします。