次の方法で共有


SUMMARIZECOLUMNS

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

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

構文

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

パラメーター

用語 定義
groupBy_columnName 返されるテーブルに個別の values が含まれるベース テーブルへの完全修飾列参照 (Table[Column])。 各groupBy_columnName列はクロス結合 (異なるテーブル) or、後続の指定された列と共に自動存在 (同じテーブル) されます。
filterTable groupBy_columnName引数として指定された列の filter コンテキスト all 追加されるテーブル式。 filter テーブルに存在する values は、クロス結合/自動存在が実行される前に filter するために使用されます。
name 指定した後続の式に使用する列名を表す文字列。
expression 1 つの value (テーブルnot) を返す任意の DAX 式。

value を返す

指定されたグループ化に基づいて、指定された列からの values の組み合わせを含むテーブル。 返されるテーブルには、指定された式の少なくとも 1 つが非blankvalue を返す行のみが含まれます。 行の /NULL を BLANKする evaluate 式 Ifall、その行は返されるテーブルに含 not。

解説

  • この関数は、結果の並べ替え順序を保証 not。

  • groupBy_columnName パラメーターでは、1 つの列を複数回指定することはできません。 たとえば、次の式は無効です。

    SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )

  • この関数は、行レベル セキュリティ (RLS) 規則 or 計算列で使用する場合に、DirectQuery モードで使用するためにサポート not。

Filter コンテキスト

次のようなクエリについて考えます。

SUMMARIZECOLUMNS ( 
    'Sales Territory'[Category], 
    FILTER('Customer', 'Customer' [First Name] = "Alicia") 
)

このクエリでは、groupBy 列を measure せずに、FILTER 式の列 (Customer テーブルなど) を含める not。 filter は、groupBy 列に適用 not。 Sales Territory and Customer テーブルは、Reseller sales fact テーブルを通じて間接的に related される場合があります。 これらは直接 relatednot されるため、filter 式は、groupBy 列が影響を受ける not no-op and です。

ただし、このクエリでは次のようになります。

SUMMARIZECOLUMNS ( 
    'Sales Territory'[Category], 'Customer' [Education], 
    FILTER('Customer', 'Customer'[First Name] = "Alicia") 
)

groupBy 列には、groupBy 結果に適用 filterfilterand の影響を受ける列が含まれています。

IGNORE

IGNORE 構文を使用すると、BLANK/NULL 評価から特定の式を省略することで、SUMMARIZECOLUMNS 関数の動作を変更できます。 all 式 notIGNORE 使用して /NULL BLANK返される行は、IGNOREevaluate を使用して /NULL ornotを BLANKするかどうかに関係なく除外されます。 IGNORE は、SUMMARIZECOLUMNS 式内でのみ使用できます。

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Total Qty", 
    IGNORE( SUM( Sales[Qty] ) ), 
    "BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 ) 
)

これにより Sales[CustomerId] 列がロールアップされ、特定のグループに含まれる all 顧客の小計が作成されます。 IGNOREがないと、結果は次のようになります。

CustomerId Total Qty BlankIfTotalQtyIsNot3
A 5
B 3 3
C 3 3

IGNOREを使用して、

CustomerId Total Qty 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 を measurevaluesに影響する not としてマークしますが、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] が 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列に基づいて結果に rollup/小計行が追加され、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] ) 
)

売上は、州別、顧客別、date別にグループ化され、小計は 1 です。 州別、date 2 別の売上。 州別、顧客別の売上 3。 両方の顧客 anddate にロールアップされ、州別の売上につながります。

次のテーブルが返されます。

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 は、SUMMARIZECOLUMNSorSUMMARIZE 式内でのみ使用できます。

小計が複数の例

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

引き続き City and 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

コンテキスト SummarizeColumns

背景

2023年2月まで、SUMMARIZECOLUMNS は allでのコンテキスト遷移内での評価をサポート not。 その monthより前にリリースされた製品では、この制限 SUMMARIZECOLUMNSnot ほとんどの手段で役立つものでした。コンテキスト遷移のいずれの場合でも、他の SUMMARIZECOLUMNSstatementsを含む measureSUMMARIZECOLUMNS を呼び出 not。

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

SummarizeColumns の種類 1 列の外部 Filter 複数の列を持つ外部 Filter 外部 GroupBy 列
GroupBy のみの SummarizeColumns OK OK OK
Filters/Measures を使用した SummarizeColumns OK ERROR ERROR

2024 年 6 月から、コンテキスト遷移で SummarizeColumns を評価できるコンテキスト SummarizeColumns が有効になり、measure の SummarizeColumns は完全にサポート now。

SummarizeColumns の種類 1 列の外部 Filter 複数の列を持つ外部 Filter 外部 GroupBy 列
GroupBy のみの SummarizeColumns OK OK OK
Filters/Measures を使用した SummarizeColumns OK OK OK

ただし、この更新プログラムには、既存の式の結果を変更する可能性がある SummarizeColumnsの動作の変更も含まれています。

外部 filters の SelfValue セマンティクス

ここでは、外部テーブルからの filters が SummarizeColumnsの GroupBy 列と対話する方法を変更する SelfValue というセマンティック概念を導入しています。 この変更により、テーブルが filter-by リレーションシップを介して relatedevenif、別のテーブルからの filters が GroupBy 列に影響することを禁止します。 この変更の影響を示す例には、次の式が含まれます。

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 の行のみが含まれていました。 ただし、更新後、SummarizeColumns 内の GroupBy 列は外部テーブルの列でフィルター処理されなくなります。evenif、それらの間にリレーションシップが存在します。 そのため、上記の例では、GroupBy 列 'Reseller Sales'[ProductKey] が 'Product'[ProductKey] 列でフィルター処理 not。 その結果、クエリには、'Reseller Sales'[ProductKey] が 229 not 等しい行が含まれます。

previous の動作を保持する If は、次に示すように、SummarizeColumnsではなく Summarize を使用して式を書き直すことができます。

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

この書き換えられた式は、GroupBy 操作が更新によって導入された SelfValue 制限の影響を受 not 元のセマンティクスを保持します。

Treatas で完全にカバー groupby 列の行検証

この更新の前に、SummarizeColumns 関数内では、次に示すように、特定のテーブルの ifallGroupBy 列は、同じテーブルの 1 つの Treatasfilter で完全にカバーされていました。

SummarizeColumns(
  Geography[Country], 
  Geography[State], 
  Treatas(
      {("United States", "Alberta")}, 
      Geography[Country], 
      Geography[State]
  )
)

上記のクエリの結果には、有効な ornotかどうかに関係なく、Treatasfilterで指定された行が含まれます。 たとえば、結果は 1 行のテーブル ("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." 

この error は、通常の filters (既存の filtersをオーバーライドする) andfiltersKeepFilters 指定された両方が同じテーブル/クラスター内に存在する場合に発生します。 次に例を示します。

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 つの filters があります。1 つは指定 KeepFilters、1 つは指定 and。 これらの filters、異なる列の外部 filters と重複しています。 現時点では、内部的には 2 つの filters が 1 つにクラスター化されるため、この構成は許可 notand、このような場合は、クラスター化された filter 全体の正しい filter オーバーライド動作をシステムが判断できません。

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

SUMMARIZE