SUMMARIZECOLUMNS
gäller för:beräknad kolumn
beräknad tabell
Mått
Visuell beräkning
Returnerar en sammanfattningstabell över en uppsättning grupper.
Syntax
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
Parametrar
Period | Definition |
---|---|
groupBy_columnName |
En fullständigt kvalificerad kolumnreferens (Tabell[Kolumn]) till en bastabell för vilken de distinkta värdena ingår i den returnerade tabellen. Varje groupBy_columnName kolumn är korskopplad (olika tabeller) eller finns automatiskt (samma tabell) med de efterföljande angivna kolumnerna. |
filterTable |
Ett tabelluttryck som läggs till i filterkontexten för alla kolumner som anges som groupBy_columnName argument. De värden som finns i filtertabellen används för att filtrera innan korskoppling/automatiskt finns. |
name |
En sträng som representerar kolumnnamnet som ska användas för det efterföljande angivna uttrycket. |
expression |
Alla DAX uttryck som returnerar ett enda värde (inte en tabell). |
Returvärde
En tabell som innehåller kombinationer av värden från de angivna kolumnerna baserat på den angivna grupperingen. Endast rader för vilka minst ett av de angivna uttrycken returnerar ett icke-tomt värde ingår i tabellen som returneras. Om alla uttryck utvärderas till BLANK/NULL för en rad inkluderas inte den raden i tabellen som returneras.
Kommentarer
Den här funktionen garanterar inte någon sorteringsordning för resultatet.
Det går inte att ange en kolumn mer än en gång i parametern groupBy_columnName. Följande formel är till exempel ogiltig.
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
Den här funktionen stöds inte för användning i DirectQuery-läge när den används i beräknade kolumner eller säkerhetsregler på radnivå (RLS).
Filterkontext
Överväg följande fråga:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
I den här frågan, utan mått, innehåller groupBy-kolumnerna inga kolumner från FILTER-uttrycket (till exempel från kundtabellen). Filtret tillämpas inte på groupBy-kolumnerna. Tabellerna Sales Territory och Customer kan vara indirekt relaterade via faktatabellen Reseller sales. Eftersom de inte är direkt relaterade är filteruttrycket en no-op och groupBy-kolumnerna påverkas inte.
Men med den här frågan:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
GroupBy-kolumnerna innehåller en kolumn som påverkas av filtret och det filtret tillämpas på groupBy-resultaten.
Med IGNORE
Syntaxen IGNORE kan användas för att ändra beteendet för funktionen SUMMARIZECOLUMNS genom att utelämna specifika uttryck från utvärderingen BLANK/NULL. Rader för vilka alla uttryck som inte använder IGNORE returnerar BLANK/NULL utesluts oberoende av om uttrycken som använder IGNORE utvärderas till BLANK/NULL eller inte. IGNORE kan bara användas i ett SUMMARIZECOLUMNS uttryck.
Exempel
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
Detta samlar kolumnen Sales[CustomerId] och skapar en delsumma för alla kunder i den angivna grupperingen. Utan IGNOREblir resultatet:
CustomerId | Totalt antal | BlankIfTotalQtyIsNot3 |
---|---|---|
A | 5 | |
F | 3 | 3 |
L | 3 | 3 |
Med IGNORE,
CustomerId | Totalt antal | BlankIfTotalQtyIsNot3 |
---|---|---|
F | 3 | 3 |
L | 3 | 3 |
Alla uttryck ignoreras,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Även om båda uttrycken returnerar blank för vissa rader inkluderas de eftersom det inte finns några oignorerade uttryck som returnerar tomma.
CustomerId | Blank | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
F | ||
L |
Med NONVISUAL
Funktionen NONVISUAL markerar ett värdefilter i SUMMARIZECOLUMNS funktion som inte påverkar måttvärden, utan endast tillämpas på groupBy-kolumner. NONVISUAL kan bara användas i ett SUMMARIZECOLUMNS uttryck.
Exempel
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]
Returnerar resultatet där [Visual Total Sales] är summan för alla år:
DimDate[CalendarYear] | [Sales] | [Visuell total försäljning] |
---|---|---|
2007 | 9,791,060.30 | 29,358,677.22 |
2008 | 9,770,899.74 | 29,358,677.22 |
Däremot samma fråga utan funktionen 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]
Returnerar resultatet där [Visual Total Sales] är summan under de två valda åren:
DimDate[CalendarYear] | [Sales] | [Visuell total försäljning] |
---|---|---|
2007 | 9,791,060.30 | 19,561,960.04 |
2008 | 9,770,899.74 | 19,561,960.04 |
Med ROLLUPADDISSUBTOTAL
Tillägget av ROLLUPADDISSUBTOTAL-syntaxen ändrar beteendet för funktionen SUMMARIZECOLUMNS genom att lägga till sammanslagnings-/delsummor i resultatet baserat på de groupBy_columnName kolumnerna. ROLLUPADDISSUBTOTAL kan bara användas i ett SUMMARIZECOLUMNS uttryck.
Exempel med enkel delsumma
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]
Returnerar följande tabell,
Kategori | Underkategori | IsCategorySubtotal | IsSubcategorySubtotal | Totalt antal |
---|---|---|---|---|
Sann | Sann | 60398 | ||
Accessoarer | Falsk | Sann | 36092 | |
Accessoarer | Cykelställ | Falsk | Falsk | 328 |
Cyklar | Mountainbikes | Falsk | Falsk | 4970 |
Kläder | Falsk | Sann | 9101 |
Exempel med flera delsummor
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
Försäljningen grupperas efter delstat, efter kund, efter datum, med delsummor för 1. Försäljning efter delstat, efter datum 2. Försäljning efter delstat, efter kund 3. Upprullad på både kund och datum som leder till försäljning efter delstat.
Returnerar följande tabell,
CustomerID | IsCustomerSubtotal | Tillstånd | Totalt antal | Datum | IsDateSubtotal |
---|---|---|---|---|---|
A | FALSE |
WA | 5 | 2014-07-10 | |
F | FALSE |
WA | 1 | 2014-07-10 | |
F | FALSE |
WA | 2 | 7/11/2014 | |
L | FALSE |
OR | 2 | 2014-07-10 | |
L | FALSE |
OR | 1 | 7/11/2014 | |
TRUE |
WA | 6 | 2014-07-10 | ||
TRUE |
WA | 2 | 7/11/2014 | ||
TRUE |
OR | 2 | 2014-07-10 | ||
TRUE |
OR | 1 | 7/11/2014 | ||
A | FALSE |
WA | 5 | TRUE |
|
F | FALSE |
WA | 3 | TRUE |
|
L | FALSE |
OR | 3 | TRUE |
|
TRUE |
WA | 8 | TRUE |
||
TRUE |
OR | 3 | TRUE |
Med ROLLUPGROUP
Precis som med funktionen SUMMARIZE kan ROLLUPGROUP användas tillsammans med ROLLUPADDISSUBTOTAL för att ange vilka sammanfattningsgrupper/kornigheter (delsummor) som ska inkluderas, vilket minskar antalet returnerade delsummor. ROLLUPGROUP kan bara användas i ett SUMMARIZECOLUMNS- eller SUMMARIZE uttryck.
Exempel med flera delsummor
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
Fortfarande grupperad efter stad och delstat, men sammansatt när du rapporterar en delsumma returnerar följande tabell.
Tillstånd | CustomerId | IsCustomerSubtotal | Totalt antal | City | IsCityStateSubtotal |
---|---|---|---|---|---|
WA | A | FALSE |
2 | Bellevue | FALSE |
WA | F | FALSE |
2 | Bellevue | FALSE |
WA | A | FALSE |
3 | Örebro | FALSE |
WA | F | FALSE |
1 | Örebro | FALSE |
OR | L | FALSE |
3 | Portland | FALSE |
WA | TRUE |
4 | Bellevue | FALSE |
|
WA | TRUE |
4 | Örebro | FALSE |
|
OR | TRUE |
3 | Portland | FALSE |
|
A | FALSE |
5 | FALSE |
||
F | FALSE |
3 | TRUE |
||
L | FALSE |
3 | TRUE |
||
TRUE |
11 | TRUE |
Kontextuell summarizeColumns
Bakgrund
Fram till februari 2023 stödde SUMMARIZECOLUMNS inte utvärdering inom en kontextövergång alls. I produkter som släpptes före den månaden gjorde denna begränsning SUMMARIZECOLUMNS inte användbar i de flesta av åtgärderna – det gick inte att kalla en åtgärd SUMMARIZECOLUMNS i alla fall av kontextövergång, inklusive andra SUMMARIZECOLUMNS-instruktioner.
Från februari 2023 stöddes kontextövergången i några scenarier, men inte i alla villkor. De fall som stöds och är begränsade är följande:
SummarizeColumns-typ | Externt filter med en kolumn | Externt filter med mer än en kolumn | Externa GroupBy-kolumner |
---|---|---|---|
SummarizeColumns med endast GroupBy | OK | OK | OK |
SummarizeColumns med filter/mått | OK | ERROR | ERROR |
Från juni 2024 aktiverar vi kontextuella SummarizeColumns som gör att SummarizeColumns kan utvärderas i alla kontextövergångar, SummarizeColumns i mått stöds nu fullt ut:
SummarizeColumns-typ | Externt filter med en kolumn | Externt filter med mer än en kolumn | Externa GroupBy-kolumner |
---|---|---|---|
SummarizeColumns med endast GroupBy | OK | OK | OK |
SummarizeColumns med filter/mått | OK | OK | OK |
Den här uppdateringen innehåller dock även ändringar i beteendet för SummarizeColumns, vilket kan ändra resultatet av befintliga uttryck:
SelfValue-semantik för externa filter
Vi introducerar ett semantiskt koncept med namnet SelfValue, som ändrar hur filter från externa tabeller interagerar med GroupBy-kolumner i SummarizeColumns. Den här ändringen tillåter inte att filter från en annan tabell påverkar GroupBy-kolumnerna, även om tabellerna är relaterade via en filter-by-relation. Ett exempel som illustrerar effekten av den här ändringen omfattar följande uttryck:
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Före den här uppdateringen skulle TreatAs-filtret gälla för GroupBy-åtgärden i SummarizeColumns, vilket utnyttjar relationen mellan 'Product'[Product Key] och 'Reseller Sales'[ProductKey]. Därför skulle frågeresultatet bara innehålla rader där "Reseller Sales"[ProductKey] är lika med 229. Men efter uppdateringen filtreras GroupBy-kolumner i SummarizeColumns inte längre efter kolumner från externa tabeller, även om det finns en relation mellan dem. I exemplet ovan filtreras därför inte GroupBy-kolumnen "Reseller Sales"[ProductKey] av kolumnen 'Product'[ProductKey]. Därför innehåller frågan rader där 'Reseller Sales'[ProductKey] inte är lika med 229.
Om du föredrar att behålla det tidigare beteendet kan du skriva om uttrycket med hjälp av Summarize i stället för SummarizeColumns, enligt nedan:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Det här omskrivna uttrycket bevarar den ursprungliga semantiken där GroupBy-åtgärden inte påverkas av den SelfValue-begränsning som introducerades av uppdateringen.
Radvalidering för groupby-kolumner som omfattas helt av Treatas
Innan den här uppdateringen, i en SummarizeColumns-funktion, om alla GroupBy-kolumner från en specifik tabell helt täcktes av ett enda Treatas-filter från samma tabell, enligt nedan:
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
Resultatet av ovanstående fråga skulle innehålla de rader som angavs i Treatas-filtret, oavsett om de var giltiga eller inte. Resultatet skulle till exempel bli en tabell med en rad ("USA", "Alberta"), även om det inte fanns någon sådan rad med [Country] = "United States" och [State] = "Alberta" i tabellen Geography.
Det här problemet var känt och har åtgärdats av uppdateringen. Efter uppdateringen filtreras sådana ogiltiga rader bort och endast giltiga rader från GroupBy-tabellen returneras. Därför skulle resultatet för frågan ovan vara tomt, eftersom det inte finns några giltiga rader som matchar de angivna värdena [Land] och [State] i tabellen Geografi.
Tillåt inte blandade Keepfilters/overriddefilters i samma tabell/kluster
Den senaste uppdateringen har infört en tillfällig begränsning som utlöser ett felmeddelande som anger:
"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."
Det här felet uppstår när både normala filter (som åsidosätter befintliga filter) och filter med KeepFilters angivna finns i samma tabell/kluster. Till exempel:
Evaluate CalculateTable(
SummarizeColumns(
Product[Color],
KeepFilters(
TreatAs(
{( "Washington")}
, Geography[State]
)
),
TreatAs(
{("United States"), ("Canada")}
, Geography[Country]
)
)
,TreatAs({("Alberta")}, Geography[State])
,TreatAs({("Canada")}, Geography[Country])
)
I uttrycket ovan finns det två filter i tabellen Geografi: ett med KeepFilters angivet och ett utan. Dessa filter överlappar externa filter på olika kolumner. För närvarande är den här konfigurationen inte tillåten eftersom de två filtren är grupperade i ett internt, och systemet kan inte fastställa rätt filter som åsidosätter beteendet för det klustrade filtret överlag i sådana fall.
Observera att den här begränsningen är tillfällig. Vi utvecklar aktivt lösningar för att ta bort den här begränsningen i framtida uppdateringar. Om du stöter på det här felet rekommenderar vi att du justerar filtren i SummarizeColumns genom att lägga till eller ta bort KeepFilters efter behov för att säkerställa konsekvent åsidosättande beteende i varje tabell.