SUMMARIZECOLUMNS
Gilt für:Berechnete Spalteberechnete TabelleMeasurevisuelle 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 (Tabelle[Spalte]) auf eine Basistabelle, für die die unterschiedlichen values in der zurückgegebenen Tabelle enthalten sind. Jede groupBy_columnName Spalte ist quer verknüpft (unterschiedliche Tabellen), or automatisch vorhanden (dieselbe Tabelle) mit den nachfolgenden angegebenen Spalten vorhanden ist. |
filterTable |
Ein Tabellenausdruck, der dem filter Kontext von all Spalten hinzugefügt wird, die als groupBy_columnName Argumente angegeben sind. Die in der filter Tabelle vorhandenen values werden verwendet, um filter, 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 eine einzelne value (not einer Tabelle) zurückgibt. |
value zurückgeben
Eine Tabelle, die Kombinationen aus values aus den bereitgestellten Spalten basierend auf der angegebenen Gruppierung enthält. Nur Zeilen, für die mindestens einer der angegebenen Ausdrücke einen nicht-blankvalue zurückgeben, sind in der zurückgegebenen Tabelle enthalten. If all Ausdrücke evaluate, um /NULL für eine Zeile zu BLANK, wird diese Zeile in der zurückgegebenen Tabelle not.
Bemerkungen
Diese Funktion garantiert not jede 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 not für die Verwendung im DirectQuery-Modus unterstützt, wenn sie in berechneten Spalten or Sicherheitsregeln auf Zeilenebene (RLS) verwendet wird.
Filter Kontext
Betrachten Sie die folgende Abfrage:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
In dieser Abfrage enthalten die spalten ohne measure die groupBy Spalten not alle Spalten aus dem ausdruck FILTER (z. B. aus der Tabelle "Kunde"). Die filter wird not auf die groupBy Spalten angewendet. Die Tabellen "Sales Territory and Customer" können indirekt über die Tabelle "Reseller Sales fact" related werden. Da sie direkt relatednot sind, ist der filter Ausdruck ein no-op and die groupBy Spalten not betroffen sind.
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 die filterand auswirkt, die 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 allnot Ausdrücke mit IGNOREBLANK/NULL zurückgeben, werden unabhängig davon ausgeschlossen, ob die Ausdrücke, die IGNOREevaluate zum BLANK/NULL-ornotverwenden, ausgeschlossen werden. 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]" zusammengesetzt, wodurch ein Teilergebnis für all 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 |
All Ausdruck ignoriert,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Even beide Ausdrücke für einige Zeilen blank zurückgeben, werden sie jedoch eingeschlossen, da keine nicht ignorierten Ausdrücke vorhanden sind, die blankzurückgeben.
CustomerId | Blank | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
Mit NONVISUAL
Die NONVISUAL-Funktion kennzeichnet eine valuefilter in SUMMARIZECOLUMNS Funktion als not auswirkungen auf measurevalues, aber nur auf groupBy Spalten angewendet wird. 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 in all Jahren 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
Das Hinzufügen der ROLLUPADDISSUBTOTAL syntax ändert das Verhalten der SUMMARIZECOLUMNS-Funktion, indem rollup/subtotal zeilen basierend auf den groupBy_columnName Spalten dem 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 |
---|---|---|---|---|
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 wird nach Bundesland, nach Kunde, nach date, mit Teilergebnissen für 1 gruppiert. Umsätze nach Bundesland, nach date 2. Nach Bundesland und Kunde 3. Rollup für beide Kunden anddate führen zu Verkäufen nach Bundesland.
Gibt die folgende Tabelle zurück:
CustomerID | IsCustomerSubtotal | State | Total Qty | Date | 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 kann nur innerhalb eines SUMMARIZECOLUMNSorSUMMARIZE 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 "City and State" gruppiert, aber beim Melden eines Teilergebnisses 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 SUMMARIZECOLUMNSnot Evaluation innerhalb eines Kontextübergangs bei allunterstützt. In produkten, die vor diesem monthveröffentlicht wurden, hat diese Einschränkung in den meisten Maßnahmen SUMMARIZECOLUMNSnot nützlich gemacht – es war not möglich, eine measureSUMMARIZECOLUMNS in jedem Fall eines Kontextübergangs, einschließlich anderer SUMMARIZECOLUMNSstatements, aufzurufen.
Ab Februar 2023 wurde der Kontextübergang in einigen Szenarien unterstützt, aber not in all den Bedingungen. Die unterstützten and eingeschränkten Fälle sind wie folgt:
SummarizeColumns Typ | Externe Filter mit einer einzelnen Spalte | Externe Filter mit mehr als einer Spalte | Externe GroupBy Spalten |
---|---|---|---|
SummarizeColumns nur mit GroupBy | OK | OK | OK |
SummarizeColumns mit Filters/Measures | OK | ERROR | ERROR |
Ab Juni 2024 ermöglichen wir kontextbezogene SummarizeColumns, mit der SummarizeColumns in jedem Kontextübergang ausgewertet werden können, SummarizeColumns in measure wird now vollständig unterstützt:
SummarizeColumns Typ | Externe Filter mit einer einzelnen Spalte | Externe Filter mit mehr als einer Spalte | Externe GroupBy Spalten |
---|---|---|---|
SummarizeColumns nur mit GroupBy | OK | OK | OK |
SummarizeColumns mit Filters/Measures | OK | OK | OK |
Dieses Update enthält jedoch auch Änderungen am Verhalten von SummarizeColumns, wodurch die Ergebnisse vorhandener Ausdrücke geändert werden können:
SelfValue-Semantik für externe filters
Wir führen ein semantisches Konzept namens SelfValue ein, das ändert, wie filters aus externen Tabellen mit GroupBy Spalten in SummarizeColumnsinteragieren. Diese Änderung verbietet filters einer anderen Tabelle, die sich auf die GroupBy Spalten auswirkt, evenif die Tabellen über eine filter-by-Beziehung related werden. 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 die TreatAsfilter auf den GroupBy-Vorgang innerhalb SummarizeColumnsangewendet, wobei die Beziehung zwischen 'Product'[Product Key] and '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 innerhalb SummarizeColumns jedoch nicht mehr nach Spalten aus externen Tabellen gefiltert, evenif zwischen ihnen besteht eine Beziehung. Daher wird in dem obigen Beispiel die Spalte GroupBy Spalte "Reseller Sales"[ProductKey] not nach der Spalte "Product"[ProductKey]" gefiltert. Daher enthält die Abfrage Zeilen, in denen "Reseller Sales"[ProductKey] not gleich 229 ist.
If Sie das verhalten previous beibehalten möchten, können Sie den Ausdruck mithilfe von Summarize anstelle von SummarizeColumnsneu 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, in der der GroupBy Vorgang not von der selfValue-Einschränkung beeinflusst wird, die von der Aktualisierung eingeführt wurde.
Zeilenüberprüfung für groupby Spalten, die vollständig von Treatas abgedeckt werden
Vor dieser Aktualisierung wurden in einer SummarizeColumns-Funktion ifallGroupBy Spalten aus einer bestimmten Tabelle vollständig von einem einzelnen Treatasfilter aus derselben Tabelle abgedeckt, 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 in der Treatasfilterangegeben wurden, unabhängig davon, ob sie gültig ornotwaren. Beispielsweise wäre das Ergebnis eine Einzeilentabelle ("Vereinigte Staaten", "Alberta"), evenif keine solche Zeile mit [Country] = "United States" and [State] = "Alberta" in der Tabelle "Geography" vorhanden.
Dieses Problem wurde bekannt, and durch das Update behoben wurde. Nach der Aktualisierung werden solche ungültigen Zeilen herausgefiltert, and nur gültige Zeilen aus der GroupBy Tabelle zurückgegeben werden. Daher wäre das Ergebnis für die oben genannte Abfrage leer, da es keine gültigen Zeilen mit dem angegebenen [Land] and [Bundesland] values in der Tabelle "Geografie" gibt.
Gemischte Keepfilters/overriddefilters auf derselben Tabelle/cluster nicht zulassen
Das kürzlich vorgenommene Update hat eine temporäre Einschränkung eingeführt, die eine error Meldung auslöst, in der Folgendes angegeben wird:
"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."
Diese error tritt auf, wenn sowohl normale filters (die vorhandene filtersaußer Kraft setzen) andfilters mit KeepFilters angegeben sind, 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 filters in der Tabelle "Geografie": eine mit KeepFilters angegebenen and ohne. Diese filters sich mit externen filters in verschiedenen Spalten überlappen. Derzeit ist diese Konfiguration not zulässig, da die beiden filters intern gruppiert sind, and das System das richtige filter Außerkraftsetzungsverhalten für das gruppierte 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. If Sie auf diese errorstoßen, empfehlen wir, die filters innerhalb SummarizeColumns anzupassen, indem Sie or entfernen KeepFilters nach Bedarf hinzufügen, um ein konsistentes Überschreibungsverhalten für jede Tabelle sicherzustellen.