次の方法で共有


SUMMARIZECOLUMNS

適用対象: 計算列 計算テーブル メジャー ビジュアル計算

グループのセットに対するサマリー テーブルを返します。

構文

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

パラメーター

用語 定義
groupBy_columnName 返されるテーブルに個別の値が含まれるベース テーブルへの完全修飾列参照 (Table [Column])。 各 groupBy_columnName 列は、その後に指定される列とクロス結合 (異なるテーブル) または auto-exist (同じテーブル) されます。
filterTable groupBy_columnName の引数として指定されたすべての列のフィルター コンテキストに追加されるテーブル式。 フィルター テーブルに存在する値は、クロス結合/auto-exist を行う前にフィルター処理するために使用されます。
name 指定した後続の式に使用する列名を表す文字列。
expression 単一の値 (テーブルではなく) を返す任意の DAX 式。

戻り値

指定したグループに基づいて、指定された列の値の組み合わせを含むテーブル。 返されるテーブルには、指定された式のうち少なくとも 1 つが空白以外の値を返す行だけが含まれます。 行のすべての式が空白または 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 構文を使用すると、空白または 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 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

これに対し、同じクエリで 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] が 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
True True 60398
Accessories False True 36092
Accessories バイク ラック False False 328
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 State Total Qty Date 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 関数と同様に、ROLLUPGROUPROLLUPADDISSUBTOTAL と共に使用して、含めるサマリー グループまたは粒度 (小計) を指定して、返される小計行の数を減らすことができます。 ROLLUPGROUP は、SUMMARIZECOLUMNS または SUMMARIZE 式内でのみ使用できます。

小計が複数の例

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

まだ都市および州別にグループ化されていますが、小計を報告するときにまとめてロールされ、次のテーブルが返されます。

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

コンテキストに応じた SummarizeColumns

背景

2023 年 2 月まで、SUMMARIZECOLUMNS はコンテキストの移行内での評価をまったくサポートしていませんでした。 この月より前にリリースされた製品では、この制限により SUMMARIZECOLUMNS はほとんどのメジャーで役に立っていませんでした。他の SUMMARIZECOLUMNS ステートメントを含む、どのような場合のコンテキスト移行であってもメジャー SUMMARIZECOLUMNS を呼び出すことはできませんでした。

2023 年 2 月以降、コンテキストの移行はいくつかのシナリオでサポートされていたものの、すべての条件ではサポートされていませんでした。 サポートされているケースと制限されているケースは、次のとおりです。

SummarizeColumns 型 単一列を持つ外部フィルター 複数の列を持つ外部フィルター 外部 GroupBy 列
GroupBy のみを持つ SummarizeColumns OK OK OK
フィルター/メジャーを持つ SummarizeColumns [OK] ERROR ERROR

2024 年 6 月以降、すべてのコンテキストの移行で SummarizeColumns が評価されるようにするコンテキストに応じた SummarizeColumns が有効になり、メジャーで SummarizeColumns が完全にサポートされるようになります。

SummarizeColumns 型 単一列を持つ外部フィルター 複数の列を持つ外部フィルター 外部 GroupBy 列
GroupBy のみを持つ SummarizeColumns OK OK OK
フィルター/メジャーを持つ SummarizeColumns OK OK OK

ただし、この更新には SummarizeColumns の動作の変更も含まれています。このため、既存の式の結果も変わる可能性があります。

外部フィルターの SelfValue セマンティクス

外部テーブルのフィルターが SummarizeColumns の GroupBy 列と対話する方法を変更する SelfValue というセマンティック概念が導入されます。 この変更により、テーブルがリレーションシップ別のフィルター処理によって関連付けられている場合でも、他のテーブルのフィルターは GroupBy 列に影響を及ぼせなくなくなります。 この変更の影響を示す例には、次の式が含まれます。

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

この更新以前は、'Product'[プロダクト キー] と 'Reseller Sales'[ProductKey] の間のリレーションシップを活用して、TreatAs フィルターは SummarizeColumns 内の GroupBy 操作に適用されていました。 その結果、クエリ結果には、'Reseller Sales'[ProductKey] が 229 の行のみが含まれていました。 更新後は、SummarizeColumns 内の GroupBy 列は、それらの間にリレーションシップが存在する場合でも、外部テーブルの列によってフィルター処理されなくなります。 したがって、上の例では、GroupBy 列 'Reseller Sales'[ProductKey] は 'Product'[ProductKey] 列でフィルター処理されません。 その結果、クエリには、'Reseller Sales'[ProductKey] が 229 ではない行が含まれます。

以前の動作を維持する必要がある場合は、以下に示すように、SummarizeColumns ではなく AddColumns または SelectColumns を使って式を書き換えることができます。

CalculateTable(
    Filter(
        SelectColumns(
            'Reseller Sales',
            "ResellerKey", 
            [ResellerKey],
            "ProductKey",
            [ProductKey]
        ),
        And(Not IsBlank([ResellerKey]),  Not IsBlank([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 と overridefilters の混在の禁止

最近の更新では、以下のエラー メッセージをトリガーする一時的な制限が導入されました。

"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 つのフィルターがあります (KeepFilters が指定されたものと指定されていないもの)。 これらのフィルターは、さまざまな列の外部フィルターと重複しています。 現在、この構成は許可されていません。内部的には 2 つのフィルターが 1 つにクラスター化されており、このような場合に、クラスター化されたフィルター全体の適切なフィルター オーバーライド動作をシステムが判断できないためです。

この制限は一時的であることに注意してください。 Microsoft は、今後の更新プログラムでこの制限を取り除くソリューションの開発に取り組んでいます。 このエラーが発生した場合は、必要に応じて KeepFilters を追加または削除して SummarizeColumns 内のフィルターを調整し、各テーブルで一貫したオーバーライド動作を確保することをお勧めします。

SUMMARIZE