SUMMARIZECOLUMNS
Gilt für:Berechnete Spalte
Berechnete Tabelle
Measure
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 unterschiedlichen Werte in der zurückgegebenen Tabelle enthalten sind. Jede groupBy_columnName Spalte ist quer verknüpft (unterschiedliche Tabellen) oder automatisch vorhanden (dieselbe Tabelle) mit den nachfolgenden angegebenen Spalten. |
filterTable |
Ein Tabellenausdruck, der dem Filterkontext aller Spalten hinzugefügt wird, die als groupBy_columnName Argumente angegeben sind. Die werte, die in der Filtertabelle vorhanden sind, werden verwendet, um zu filtern, bevor cross-join/auto-exist ausgeführt wird. |
name |
Eine Zeichenfolge, die den Spaltennamen darstellt, der für den nachfolgenden angegebenen Ausdruck verwendet werden soll. |
expression |
Ein beliebiger DAX Ausdruck, der einen einzelnen Wert zurückgibt (keine Tabelle). |
Rückgabewert
Eine Tabelle, die Kombinationen von Werten aus den angegebenen Spalten basierend auf der angegebenen Gruppierung enthält. Nur Zeilen, für die mindestens einer der angegebenen Ausdrücke einen nicht leeren Wert zurückgibt, sind in der zurückgegebenen Tabelle enthalten. Wenn alle Ausdrücke als BLANK/NULL für eine Zeile ausgewertet werden, ist diese Zeile nicht in der zurückgegebenen Tabelle 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] )
Diese Funktion wird für die Verwendung im DirectQuery-Modus nicht unterstützt, wenn sie in berechneten Spalten oder Sicherheitsregeln auf Zeilenebene (RLS) verwendet wird.
Filterkontext
Betrachten Sie die folgende Abfrage:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
In dieser Abfrage enthalten die "groupBy"-Spalten keine Spalten aus dem ausdruck FILTER (z. B. aus der Tabelle "Kunde"). Der Filter wird nicht auf die "groupBy"-Spalten angewendet. Die Tabellen "Sales Territory" und "Customer" können indirekt über die Tabelle "Reseller Sales Fact" verknüpft sein. Da sie nicht direkt verknüpft sind, ist der Filterausdruck ein no-op und die "groupBy"-Spalten sind 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 sich auf den Filter auswirkt und dieser Filter auf die groupBy-Ergebnisse angewendet wird.
Mit IGNORE
Die IGNORE Syntax kann verwendet werden, um das Verhalten der SUMMARIZECOLUMNS-Funktion zu ändern, indem bestimmte Ausdrücke aus der BLANK/NULL-Auswertung weggelassen werden. Zeilen, für die alle Ausdrücke, die IGNORE nicht verwenden, BLANK/NULL zurückgeben, werden unabhängig davon ausgeschlossen, ob die Ausdrücke, die IGNORE verwenden, ausgewertet werden, um /NULL zu BLANKoder nicht. IGNORE kann nur innerhalb eines SUMMARIZECOLUMNS Ausdrucks verwendet werden.
Beispiel
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
Dadurch wird die Spalte "Sales[CustomerId]" aufgeschlüsselt, wodurch ein Teilergebnis für alle Kunden in der angegebenen Gruppierung erstellt wird. Ohne IGNORElautet das Ergebnis:
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 leer sind, werden sie eingeschlossen, da keine nicht ignorierten Ausdrücke vorhanden sind, die leer zurückgeben.
CustomerId | Leer | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
Mit NONVISUAL
Die NONVISUAL-Funktion kennzeichnet einen Wertfilter in SUMMARIZECOLUMNS Funktion nicht auf Messwerte, sondern nur auf groupBy-Spalten angewendet. NONVISUAL kann nur innerhalb eines SUMMARIZECOLUMNS Ausdrucks 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, bei dem [Visuelle Gesamtumsatz] die Summe aller 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 Gegensatz dazu dieselbe Abfrage ohne die funktion 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]
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 wird das Verhalten der SUMMARIZECOLUMNS-Funktion geändert, indem Rollup-/Teilergebniszeilen basierend auf den groupBy_columnName Spalten zum Ergebnis hinzugefügt werden. ROLLUPADDISSUBTOTAL kann nur innerhalb eines SUMMARIZECOLUMNS Ausdrucks 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 |
---|---|---|---|---|
STIMMT | STIMMT | 60398 | ||
Accessories | FALSCH | STIMMT | 36092 | |
Accessories | Fahrradträger | FALSCH | FALSCH | 328 |
Bikes | Mountainbikes | FALSCH | FALSCH | 4970 |
Clothing | FALSCH | STIMMT | 9101 |
Beispiel mit mehreren Zwischensummen
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
Der Umsatz wird nach Bundesland, nach Kunde, datum, mit Teilergebnissen für 1 gruppiert. Umsätze nach Bundesland, nach Datum 2. Nach Bundesland und Kunde 3. Rollup für Kunden und Datum, die zu Verkäufen nach Bundesland führen.
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 |
OR | 2 | 7/10/2014 | |
C | FALSE |
OR | 1 | 7/11/2014 | |
TRUE |
WA | 6 | 7/10/2014 | ||
TRUE |
WA | 2 | 7/11/2014 | ||
TRUE |
OR | 2 | 7/10/2014 | ||
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 |
Mit ROLLUPGROUP
Wie bei der SUMMARIZE-Funktion können ROLLUPGROUP zusammen mit ROLLUPADDISSUBTOTAL verwendet werden, um anzugeben, welche Sammelgruppen/Granularitäten (Teilergebnisse) einbezogen werden sollen, wodurch die Anzahl der zurückgegebenen Teilergebniszeilen reduziert wird. ROLLUPGROUP können nur innerhalb eines SUMMARIZECOLUMNS oder SUMMARIZE Ausdrucks verwendet werden.
Beispiel mit mehreren Zwischensummen
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
Nach Ort und Bundesland gruppiert, aber zusammengerollt, wenn ein Teilergebnis gemeldet 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 |
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 |
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, hat diese Einschränkung in den meisten Maßnahmen SUMMARIZECOLUMNS nicht nützlich gemacht – es war nicht möglich, eine Maßnahme SUMMARIZECOLUMNS in jedem Fall eines Kontextübergangs, einschließlich anderer SUMMARIZECOLUMNS Aussagen, aufzurufen.
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/Measures | OK | ERROR | ERROR |
Ab Juni 2024 aktivieren wir kontextbezogene "SummarizeColumns", mit denen "SummarizeColumns" in jedem Kontextübergang ausgewertet werden kann. "SummarizeColumns" wird jetzt 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/Measures | 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" genutzt wird[ProductKey]. 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 mithilfe von "Summarize" anstelle von "SummarizeColumns" neu schreiben, wie unten dargestellt:
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 [Land] und [Bundesland]-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.