Freigeben über


SUMMARIZECOLUMNS

Gilt für: Berechnete Spalte Berechnete Tabelle Ergebnis visuelle Berechnung

Gibt eine Zusammenfassungstabelle für einen Satz von Gruppen zurück.

Syntax

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

Parameter

Begriff Definition
groupBy_columnName Ein vollqualifizierter Spaltenverweis (Table[Column]) auf eine Basistabelle, für die die einzelnen Werte in der zurückgegebenen Tabelle enthalten sind. Jede „groupBy_columnName“-Spalte wird mittels „Cross Join“ (unterschiedliche Tabellen) oder „Auto Exist“ (dieselbe Tabelle) mit den nachfolgenden angegebenen Spalten verbunden.
filterTable Ein Tabellenausdruck, der dem Filterkontext aller Spalten hinzugefügt wird, die als „groupBy_columnName“-Argumente angegeben sind. Die in der Filtertabelle vorhandenen Werte werden verwendet, um vor der Ausführung von „Cross Join“ bzw. „Auto Exist“ zu filtern.
name Eine Zeichenfolge, die den Spaltennamen darstellt, der für den nachfolgenden angegebenen Ausdruck verwendet werden soll.
expression Ein DAX-Ausdruck, der einen einzelnen Wert (keine Tabelle) zurückgibt.

Rückgabewert

Es wird eine Tabelle zurückgegeben, die Kombinationen von Werten aus den angegebenen Spalten basierend auf der angegebenen Gruppierung enthält. Nur Zeilen, für die mindestens ein angegebener Ausdruck einen nicht leeren Wert zurückgibt, sind in der zurückgegebenen Tabelle enthalten. Wenn alle Ausdrücke für eine Zeile mit BLANK/NULL ausgewertet werden, ist diese Zeile in der zurückgegebenen Tabelle nicht enthalten.

Bemerkungen

  • Diese Funktion garantiert keine Sortierreihenfolge für die Ergebnisse.

  • Eine Spalte kann im „groupBy_columnName“-Parameter nur einmal angegeben werden. Die folgende Formel ist beispielsweise ungültig.

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

  • Die Verwendung dieser Funktion im DirectQuery-Modus wird nicht unterstützt, wenn sie in berechneten Spalten oder RLS-Regeln (Row-Level Security) eingesetzt wird.

Filterkontext

Betrachten Sie die folgende Abfrage:

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

In dieser Abfrage enthalten die „groupBy“-Spalten ohne Measure keine Spalten aus dem FILTER-Ausdruck (z. B. aus der Tabelle „Customer“). Der Filter wird auf die „groupBy“-Spalten nicht angewendet. Die Tabellen „Sales Territory“ und „Customer“ können über die Faktentabelle zum Umsatz der Handelspartner indirekt miteinander verknüpft sein. Da sie nicht direkt miteinander verknüpft sind, ist der Filterausdruck kein Vorgang und die „groupBy“-Spalten sind hiervon nicht betroffen.

Die Abfrage sieht folgendermaßen aus:

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

Die „groupBy“-Spalten enthalten eine Spalte, die vom Filter betroffen ist, und dieser Filter wird auf die „groupBy“-Ergebnisse angewendet.

Mit IGNORE

Die IGNORE-Syntax kann verwendet werden, um das Verhalten der SUMMARIZECOLUMNS-Funktion zu ändern, indem bestimmte Ausdrücke in der Auswertung mit einem leeren Wert/NULL ausgelassen werden. Zeilen, für die alle Ausdrücke, in denen IGNORE nicht verwendet wird, einen leeren Wert/NULL zurückgeben, werden unabhängig davon ausgeschlossen, ob die Ausdrücke, die IGNORE verwenden, mit einem leeren Wert/NULL ausgewertet werden. IGNORE kann nur in einem SUMMARIZECOLUMNS-Ausdruck verwendet werden.

Beispiel

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

Führt ein Rollup für die „Sales[CustomerId]“-Spalte aus, und erstellt damit eine Zwischensumme für alle Kunden in der angegebenen Gruppierung. Ohne IGNORE lautet das Ergebnis wie folgt:

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

Mit IGNORE:

CustomerId Total Qty BlankIfTotalQtyIsNot3
B 3 3
C 3 3

Alle Ausdrücke ignoriert:

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Blank", 
    IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5", 
    IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) ) 
)

Obwohl beide Ausdrücke für einige Zeilen einen leeren Wert zurückgeben, werden sie einbezogen, da keine nicht ignorierten Ausdrücke vorhanden sind, die einen leeren Wert zurückgeben.

CustomerId Leer BlankIfTotalQtyIsNot5
A 5
B
C

Mit NONVISUAL

Die NONVISUAL-Funktion kennzeichnet einen Wertfilter in der SUMMARIZECOLUMNS-Funktion als einen Filter, der keine Auswirkungen auf Measurewerte hat, sondern nur auf „groupBy“-Spalten angewendet wird. NONVISUAL kann nur in einem SUMMARIZECOLUMNS-Ausdruck verwendet werden.

Beispiel

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]

Gibt das Ergebnis zurück, wobei [Visual Total Sales] die Summe über alle Jahre ist:

DimDate[CalendarYear] [Sales] [Visual Total Sales]
2007 9.791.060,30 29.358.677,22
2008 9.770.899,74 29.358.677,22

Im Vergleich dazu die gleiche Abfrage ohne die NONVISUAL-Funktion:

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]

Gibt das Ergebnis zurück, wobei [Visual Total Sales] die Summe über die beiden ausgewählten Jahre ist:

DimDate[CalendarYear] [Sales] [Visual Total Sales]
2007 9.791.060,30 19.561.960,04
2008 9.770.899,74 19.561.960,04

Mit ROLLUPADDISSUBTOTAL

Durch das Hinzufügen der ROLLUPADDISSUBTOTAL-Syntax ändert sich das Verhalten der SUMMARIZECOLUMNS-Funktion, indem dem Ergebnis basierend auf den „groupBy_spaltenName“-Spalten Rollup-/Zwischensummenzeilen hinzugefügt werden. ROLLUPADDISSUBTOTAL kann nur in einem SUMMARIZECOLUMNS-Ausdruck verwendet werden.

Beispiel mit einer einzelnen Zwischensumme

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]

Gibt die folgende Tabelle zurück:

Category Unterkategorie IsCategorySubtotal IsSubcategorySubtotal Total Qty
True True 60398
Accessories False True 36092
Accessories Fahrradträger False False 328
Bikes Mountainbikes False False 4970
Clothing False True 9101

Beispiel mit mehreren Zwischensummen

SUMMARIZECOLUMNS ( 
    Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ), 
    ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] ) 
)

Der Umsatz wurde nach Bundesland, Kunde und Datum mit Zwischensummen für 1 gruppiert. Umsatz nach Bundesland und Datum 2. Nach Bundesland und Kunde 3. Rollup für Kunde und Datum ergibt Umsatz nach Bundesland.

Gibt die folgende Tabelle zurück:

CustomerID IsCustomerSubtotal State Total Qty Datum IsDateSubtotal
A false WA 5 7/10/2014
B false WA 1 7/10/2014
B false WA 2 7/11/2014
C false oder 2 7/10/2014
C false oder 1 7/11/2014
true WA 6 7/10/2014
true WA 2 7/11/2014
true oder 2 7/10/2014
true oder 1 7/11/2014
A false WA 5 true
B false WA 3 true
C false oder 3 TRUE
TRUE WA 8 TRUE
TRUE oder 3 true

Mit ROLLUPGROUP

ROLLUPGROUP kann wie die SUMMARIZE-Funktion zusammen mit ROLLUPADDISSUBTOTAL verwendet werden, um anzugeben, welche Zusammenfassungsgruppen/Granularitäten (Zwischensummen) einbezogen werden sollen, um die Anzahl der zurückgegebenen Zwischensummenzeilen zu reduzieren. ROLLUPGROUP kann nur in einem SUMMARIZECOLUMNS- oder SUMMARIZE-Ausdruck verwendet werden.

Beispiel mit mehreren Zwischensummen

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

Wenn weiterhin nach Stadt und Bundesstaat gruppiert, beim Melden einer Zwischensumme jedoch ein gemeinsames Rollup ausgeführt wird, wird die folgende Tabelle zurückgegeben:

State CustomerId IsCustomerSubtotal Total Qty 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
oder C false 3 Portland false
WA true 4 Bellevue false
WA true 4 Redmond false
oder true 3 Portland false
A false 5 FALSE
B false 3 true
C false 3 TRUE
TRUE 11 TRUE

Kontextbezogene "SummarizeColumns"

Hintergrund

Bis Februar 2023 hat SUMMARIZECOLUMNS die Auswertung in einem Kontextübergang überhaupt nicht unterstützt. In Produkten, die vor diesem Monat veröffentlicht wurden, war wegen dieser Einschränkung SUMMARIZECOLUMNS in den meisten Maßnahmen nicht nützlich – es war nicht möglich, SUMMARIZECOLUMNS ein Ergebnis in einem Kontextübergang zu betiteln, einschließlich anderer SUMMARIZECOLUMNS-Anweisungen.

Ab Februar 2023 wurde der Kontextübergang in einigen Szenarien unterstützt, aber nicht in allen Bedingungen. Die unterstützten und eingeschränkten Fälle sind wie folgt:

SummarizeColumns Typ Externer Filter mit einzelner Spalte Externer Filter mit mehr als einer Spalte Externe GroupBy-Spalten
Nur "SummarizeColumns" mit "GroupBy" OK OK OK
SummarizeColumns mit Filtern/Ergebnissen OK FEHLER FEHLER

Ab Juni 2024 aktivieren wir kontextbezogene "SummarizeColumns", mit denen "SummarizeColumns" in jedem Kontextübergang ausgewertet werden kann. "SummarizeColumns" wird jetzt im Ergebnis vollständig unterstützt:

SummarizeColumns Typ Externer Filter mit einzelner Spalte Externer Filter mit mehr als einer Spalte Externe GroupBy-Spalten
Nur "SummarizeColumns" mit "GroupBy" OK OK OK
SummarizeColumns mit Filtern/Ergebnissen OK OK OK

Dieses Update enthält jedoch auch Änderungen am Verhalten von SummarizeColumns, die die Ergebnisse vorhandener Ausdrücke ändern können:

SelfValue-Semantik für externe Filter

Wir führen ein semantisches Konzept namens SelfValue ein, das ändert, wie Filter aus externen Tabellen mit GroupBy-Spalten in SummarizeColumns interagieren. Diese Änderung verbietet Filter aus einer anderen Tabelle, die sich auf die GroupBy-Spalten auswirken, auch wenn die Tabellen über eine Filter-nach-Beziehung verknüpft sind. Ein Beispiel zur Veranschaulichung der Auswirkungen dieser Änderung umfasst den folgenden Ausdruck:

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

Vor diesem Update würde der TreatAs-Filter auf den GroupBy-Vorgang in SummarizeColumns angewendet, wobei die Beziehung zwischen 'Product'[Product Key] und 'Reseller Sales'[ProductKey] genutzt wird. Folglich würden die Abfrageergebnisse nur Zeilen enthalten, in denen 'Reseller Sales'[ProductKey] gleich 229 ist. Nach der Aktualisierung werden "GroupBy"-Spalten in "SummarizeColumns" jedoch nicht mehr nach Spalten aus externen Tabellen gefiltert, auch wenn eine Beziehung zwischen ihnen besteht. Daher wird in dem obigen Beispiel die Spalte "GroupBy" 'Reseller Sales'[ProductKey] nicht nach der Spalte 'Product'[ProductKey] gefiltert. Daher enthält die Abfrage Zeilen, in denen 'Reseller Sales'[ProductKey] nicht gleich 229 ist.

Wenn Sie das vorherige Verhalten beibehalten möchten, können Sie den Ausdruck umschreiben, indem Sie „Summarize“ anstelle von „SummarizeColumns“ verwenden, wie unten gezeigt:

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

Dieser umgeschriebene Ausdruck behält die ursprüngliche Semantik bei, bei der der GroupBy-Vorgang nicht von der SelfValue-Einschränkung betroffen ist, die durch das Update eingeführt wurde.

Zeilenüberprüfung für Gruppenspalten, die vollständig von Treatas abgedeckt werden

Vor diesem Update innerhalb einer SummarizeColumns-Funktion, wenn alle GroupBy-Spalten aus einer bestimmten Tabelle vollständig von einem einzelnen Treatas-Filter aus derselben Tabelle abgedeckt wurden, wie unten dargestellt:

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

Das Ergebnis der obigen Abfrage würde alle Zeilen enthalten, die im Treatas-Filter angegeben wurden, unabhängig davon, ob sie gültig waren oder nicht. Beispielsweise wäre das Ergebnis eine Einzeilentabelle ("Vereinigte Staaten", "Alberta"), auch wenn keine solche Zeile mit [Country] = "United States" und [State] = "Alberta" in der Tabelle "Geography" vorhanden ist.

Dieses Problem wurde bekannt und wurde vom Update behoben. Nach der Aktualisierung werden solche ungültigen Zeilen herausgefiltert, und nur gültige Zeilen aus der GroupBy-Tabelle werden zurückgegeben. Daher wäre das Ergebnis für die oben genannte Abfrage leer, da keine gültigen Zeilen vorhanden sind, die den angegebenen [Country] und [State]-Werten in der Tabelle "Geographie" entsprechen.

Gemischte Keepfilter/Overriddefilter auf derselben Tabelle/einem Cluster nicht zulassen

Das aktuelle Update hat eine temporäre Einschränkung eingeführt, die eine Fehlermeldung auslöst, die folgendes angibt:

"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." 

Dieser Fehler tritt auf, wenn sowohl normale Filter (die vorhandene Filter außer Kraft setzen) als auch Filter mit angegebenen KeepFiltern innerhalb derselben Tabelle/desselben Clusters vorhanden sind. Zum Beispiel:

Evaluate CalculateTable(
  SummarizeColumns(
      Product[Color],
      KeepFilters(
          TreatAs(
              {( "Washington")}
              , Geography[State]
          )
      ),
      TreatAs(
          {("United States"), ("Canada")}
          , Geography[Country]
      )
  )
  ,TreatAs({("Alberta")}, Geography[State])
  ,TreatAs({("Canada")}, Geography[Country])
)

Im obigen Ausdruck gibt es zwei Filter in der Tabelle "Geografie": eines mit "KeepFilters", die angegeben sind, und einen Filter ohne. Diese Filter überlappen sich mit externen Filtern in verschiedenen Spalten. Derzeit ist diese Konfiguration nicht zulässig, da intern die beiden Filter gruppiert sind und das System das richtige Filterüberschreibungsverhalten für den gruppierten Filter insgesamt in solchen Fällen nicht ermitteln kann.

Bitte beachten Sie, dass diese Einschränkung vorübergehend ist. Wir entwickeln aktiv Lösungen, um diese Einschränkung in zukünftigen Updates zu entfernen. Wenn dieser Fehler auftritt, empfehlen wir, die Filter in "SummarizeColumns" anzupassen, indem KeepFilters nach Bedarf hinzugefügt oder entfernt werden, um ein konsistentes Überschreibungsverhalten für jede Tabelle sicherzustellen.

SUMMARIZE