Dela via


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.
uttryck 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 ett 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 BLANK/NULL-utvärderingen. Rader för vilka alla uttryck som inte använder IGNORE returnerar BLANK/NULL undantas 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 IGNORE är 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 Tom BlankIfTotalQtyIsNot5
A 5
F
C

Med ICKEVISUAL

Funktionen NONVISUAL markerar ett värdefilter i funktionen SUMMARIZECOLUMNS som inte påverkar måttvärden, utan endast tillämpas på groupBy-kolumner. NONVISUAL kan endast 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 syntaxen ROLLUPADDISSUBTOTAL ändrar beteendet för funktionen SUMMARIZECOLUMNS genom att lägga till sammanslagnings-/delsummor i resultatet baserat på groupBy_columnName kolumner. 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
Sant Sant 60398
Accessoarer Falsk Sant 36092
Accessoarer Cykelställ Falsk Falsk 328
Cyklar Mountainbikes Falsk Falsk 4970
Kläder Falsk Sant 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 Falskt WA 5 2014-07-10
F Falskt WA 1 2014-07-10
F Falskt WA 2 7/11/2014
C Falskt ELLER 2 2014-07-10
C Falskt ELLER 1 7/11/2014
Sant WA 6 2014-07-10
Sant WA 2 7/11/2014
Sant ELLER 2 2014-07-10
Sant ELLER 1 7/11/2014
A Falskt WA 5 Sant
F Falskt WA 3 Sant
C Falskt ELLER 3 Sant
Sant WA 8 Sant
Sant ELLER 3 Sant

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 Falskt 2 Bellevue Falskt
WA F Falskt 2 Bellevue Falskt
WA A Falskt 3 Örebro Falskt
WA F Falskt 1 Örebro Falskt
ELLER C Falskt 3 Portland Falskt
WA Sant 4 Bellevue Falskt
WA Sant 4 Örebro Falskt
ELLER Sant 3 Portland Falskt
A Falskt 5 Falskt
F Falskt 3 Sant
C Falskt 3 Sant
Sant 11 Sant

Kontextuell summarizeColumns

Bakgrund

Fram till februari 2023 hade SUMMARIZECOLUMNS inte stöd för utvärdering inom en kontextövergång alls. I produkter som släpptes före den månaden gjorde den här begränsningen SUMMARIZECOLUMNS inte användbar i de flesta mått – det gick inte att anropa ett mått 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 vara en tabell med en rad ("USA", "Alberta"), även om det inte fanns någon sådan rad med [Country] = "USA" och [State] = "Alberta" i tabellen Geografi.

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.

SAMMANFATTA