Del via


SUMMARIZECOLUMNS

Gælder for: Beregning af målingsvisualisering for beregnet kolonne i beregnet tabel

Returnerer en oversigtstabel over et sæt grupper.

Syntaks

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

Parametre

Begreb Definition
groupBy_columnName En fuldt kvalificeret kolonnereference (Table[Column]) til en basistabel, hvor de entydige værdier er inkluderet i den returnerede tabel. Hver groupBy_columnName kolonne er joinforbundet (forskellige tabeller) eller fandtes automatisk (samme tabel) med de efterfølgende angivne kolonner.
filterTable Et tabeludtryk, der føjes til filterkonteksten for alle kolonner, der er angivet som groupBy_columnName argumenter. De værdier, der findes i filtertabellen, bruges til at filtrere, før cross-join/auto-exist udføres.
navn En streng, der repræsenterer det kolonnenavn, der skal bruges til det efterfølgende angivne udtryk.
udtryk Ethvert DAX-udtryk, der returnerer en enkelt værdi (ikke en tabel).

Returværdi

En tabel, der indeholder kombinationer af værdier fra de angivne kolonner baseret på den angivne gruppering. Det er kun rækker, hvor mindst ét af de angivne udtryk returnerer en ikke-tom værdi, der er inkluderet i den returnerede tabel. Hvis alle udtryk evalueres til BLANK/NULL for en række, medtages denne række ikke i den returnerede tabel.

Bemærkninger

  • Denne funktion garanterer ikke nogen sorteringsrækkefølge for resultaterne.

  • En kolonne kan ikke angives mere end én gang i parameteren groupBy_columnName. Følgende formel er f.eks. ugyldig.

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

  • Denne funktion understøttes ikke til brug i DirectQuery-tilstand, når den bruges i beregnede kolonner eller RLS-regler (row-level security).

Filterkontekst

Overvej følgende forespørgsel:

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

Uden en måling indeholder groupBy-kolonnerne i denne forespørgsel ingen kolonner fra udtrykket FILTER (f.eks. fra tabellen Customer). Filteret anvendes ikke på groupBy-kolonnerne. Tabellerne Sales Territory og Customer kan være indirekte relateret via faktatabellen Reseller sales. Da de ikke er direkte relateret, er filterudtrykket et no-op, og groupBy-kolonnerne påvirkes ikke.

Men med denne forespørgsel:

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

GroupBy-kolonnerne indeholder en kolonne, der påvirkes af filteret, og dette filter anvendes på groupBy-resultaterne.

Med IGNORE

IGNORE-syntaksen kan bruges til at ændre funktionsmåden for funktionen SUMMARIZECOLUMNS ved at udelade bestemte udtryk fra BLANK/NULL-evalueringen. Rækker, hvor alle udtryk, der ikke bruger IGNORE, returnerer BLANK/NULL, udelades uafhængigt af, om de udtryk, der bruger IGNORE, evalueres til BLANK/NULL eller ej. IGNORE kan kun bruges i et SUMMARIZECOLUMNS-udtryk.

Eksempel

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

Dette akkumulerer kolonnen Sales[CustomerId] og opretter en subtotal for alle kunder i den angivne gruppering. Uden IGNORE er resultatet:

CustomerId Samlet antal BlankIfTotalQtyIsNot3
A 5
F 3 3
L 3 3

Med IGNORE,

CustomerId Samlet antal BlankIfTotalQtyIsNot3
F 3 3
L 3 3

Alle-udtrykket ignoreres,

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

Selvom begge udtryk returnerer tomme for nogle rækker, medtages de, da der ikke er nogen ikke-diagnosticerede udtryk, der returnerer tomme.

CustomerId Tom BlankIfTotalQtyIsNot5
A 5
F
C

Med NONVISUAL

Funktionen NONVISUAL markerer et værdifilter i funktionen SUMMARIZECOLUMNS, som ikke påvirker målingsværdier, men kun gælder for groupBy-kolonner. NONVISUAL kan kun bruges i et SUMMARIZECOLUMNS-udtryk.

Eksempel

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]

Returnerer resultatet, hvor [Visual Total Sales] er totalen på tværs af alle år:

DimDate[CalendarYear] [Salg] [Samlet salg af visualiseringer]
2007 9,791,060.30 29,358,677.22
2008 9,770,899.74 29,358,677.22

I modsætning hertil er den samme forespørgsel uden 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]

Returnerer resultatet, hvor [Visual Total Sales] er totalen på tværs af de to valgte år:

DimDate[CalendarYear] [Salg] [Samlet salg af visualiseringer]
2007 9,791,060.30 19,561,960.04
2008 9,770,899.74 19,561,960.04

Med ROLLUPADDISSUBTOTAL

Tilføjelsen af syntaksen ROLLUPADDISSUBTOTAL ændrer funktionsmåden for funktionen SUMMARIZECOLUMNS ved at føje akkumulerede rækker/subtotalrækker til resultatet baseret på de groupBy_columnName kolonner. ROLLUPADDISSUBTOTAL kan kun bruges i et SUMMARIZECOLUMNS-udtryk.

Eksempel med enkelt subtotal

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]

Returnerer følgende tabel,

Kategori Underkategori IsCategorySubtotal IsSubcategorySubtotal Samlet antal
True True 60398
Accessories Falsk True 36092
Accessories Cykelstativer Falsk Falsk 328
Cykler Mountain Bikes Falsk Falsk 4970
Tøj Falsk True 9101

Eksempel med flere subtotaler

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

Salg grupperes efter delstat, efter kunde, efter dato med subtotaler for 1. Salg efter delstat, efter dato 2. Salg efter delstat, efter kunde 3. Opløftet på både kunde og dato, der fører til salg efter delstat.

Returnerer følgende tabel,

CustomerID IsCustomerSubtotal State Samlet antal Dato IsDateSubtotal
A FALSE WA 5 7/10/2014
F FALSE WA 0 7/10/2014
F FALSE WA 2 7/11/2014
C FALSE ELLER 2 7/10/2014
C FALSE ELLER 0 7/11/2014
SANDT WA 6 7/10/2014
SANDT WA 2 7/11/2014
SANDT ELLER 2 7/10/2014
SANDT ELLER 0 7/11/2014
A FALSE WA 5 SANDT
F FALSE WA 3 SANDT
C FALSE ELLER 3 SANDT
SANDT WA 8 SANDT
SANDT ELLER 3 SANDT

Med ROLLUPGROUP

Ligesom med funktionen SUMMARIZE kan ROLLUPGROUP bruges sammen med ROLLUPADDISSUBTOTAL til at angive, hvilke oversigtsgrupper/granulariteter (subtotaler), der skal medtages, hvilket reducerer antallet af returnerede rækker med subtotaler. ROLLUPGROUP kan kun bruges i et SUMMARIZECOLUMNS- eller SUMMARIZE-udtryk .

Eksempel med flere subtotaler

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

Stadig grupperet efter City og State, men akkumuleret, når der rapporteres en subtotal, returnerer følgende tabel,

State CustomerId IsCustomerSubtotal Samlet antal City IsCityStateSubtotal
WA A FALSE 2 Bellevue FALSE
WA F FALSE 2 Bellevue FALSE
WA A FALSE 3 Vejle FALSE
WA F FALSE 0 Vejle FALSE
ELLER C FALSE 3 Portland FALSE
WA SANDT 4 Bellevue FALSE
WA SANDT 4 Vejle FALSE
ELLER SANDT 3 Portland FALSE
A FALSE 5 FALSE
F FALSE 3 SANDT
C FALSE 3 SANDT
SANDT 11 SANDT

Kontekstafhængige SummarizeColumns

Baggrund

Indtil februar 2023 understøtter SUMMARIZECOLUMNS overhovedet ikke evaluering inden for en kontekstovergang. I produkter, der blev udgivet før denne måned, gjorde denne begrænsning SUMMARIZECOLUMNS ikke nyttig i de fleste af målingerne – det var ikke muligt at kalde en måling SUMMARIZECOLUMNS i alle tilfælde af kontekstovergang, herunder andre SUMMARIZECOLUMNS-sætninger.

Fra februar 2023 blev kontekstovergangen understøttet i nogle få scenarier, men ikke under alle betingelser. De understøttede og begrænsede sager er som følger:

SummarizeColumns-type Eksternt filter med en enkelt kolonne Eksternt filter med mere end én kolonne Eksterne GroupBy-kolonner
SummarizeColumns med Kun GroupBy OK OK OK
SummarizeColumns med filtre/målinger OK FEJL FEJL

Fra juni 2024 aktiverer vi kontekstafhængige SummarizeColumns, som gør det muligt at evaluere SummarizeColumns i en hvilken som helst kontekstovergang. SummarizeColumns understøttes nu fuldt ud:

SummarizeColumns-type Eksternt filter med en enkelt kolonne Eksternt filter med mere end én kolonne Eksterne GroupBy-kolonner
SummarizeColumns med Kun GroupBy OK OK OK
SummarizeColumns med filtre/målinger OK OK OK

Denne opdatering indeholder dog også ændringer af funktionsmåden for SummarizeColumns, som kan ændre resultaterne af eksisterende udtryk:

SelfValue-semantik for eksterne filtre

Vi introducerer et semantisk koncept med navnet SelfValue, som ændrer, hvordan filtre fra eksterne tabeller interagerer med GroupBy-kolonner i SummarizeColumns. Denne ændring giver ikke filtre fra en anden tabel adgang til at påvirke GroupBy-kolonnerne, selvom tabellerne er relateret via en filter efter-relation. Et eksempel, der illustrerer virkningen af denne ændring, omfatter følgende udtryk:

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

Før denne opdatering gælder TreatAs-filteret for GroupBy-handlingen i SummarizeColumns, hvor relationen mellem 'Product'[Product Key] og 'Reseller Sales' [ProductKey] anvendes. Forespørgselsresultaterne omfatter derfor kun rækker, hvor 'Reseller Sales'[ProductKey] er lig med 229. Efter opdateringen filtreres GroupBy-kolonner i SummarizeColumns dog ikke længere efter kolonner fra eksterne tabeller, selvom der findes en relation mellem dem. Derfor filtreres kolonnen GroupBy i eksemplet ovenfor 'Reseller Sales'[ProductKey] ikke af kolonnen 'Product'[ProductKey]. Derfor indeholder forespørgslen rækker, hvor 'Reseller Sales'[ProductKey] ikke er lig med 229.

Hvis du foretrækker at bevare den tidligere funktionsmåde, kan du omskrive udtrykket ved hjælp af Summarize i stedet for SummarizeColumns, som vist nedenfor:

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

Dette omskrevne udtryk bevarer den oprindelige semantik, hvor GroupBy-handlingen ikke påvirkes af den SelfValue-begrænsning, der blev introduceret af opdateringen.

Rækkevalidering for groupby-kolonner, der er fuldt dækket af Treatas

Før denne opdatering var alle GroupBy-kolonner fra en bestemt tabel fuldt dækket af et enkelt Treatas-filter fra den samme tabel, som vist nedenfor, i en SummarizeColumns-funktion:

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

Resultatet af ovenstående forespørgsel omfatter de rækker, der er angivet i Treatas-filteret, uanset om de er gyldige eller ej. Resultatet vil f.eks. være en tabel med en enkelt række ("USA", "Alberta"), selvom der ikke fandtes en sådan række med [Country] = "USA" og [State] = "Alberta" i tabellen 'Geography'.

Dette problem blev kendt og er blevet løst af opdateringen. Efter opdateringen filtreres sådanne ugyldige rækker fra, og der returneres kun gyldige rækker fra tabellen GroupBy. Resultatet af ovenstående forespørgsel ville derfor være tomt, da der ikke er nogen gyldige rækker, der svarer til de angivne værdier [Country] og [State] i tabellen 'Geography'.

Tillad ikke blandede Keepfilters/overriddefilters på samme tabel/klynge

Den seneste opdatering har introduceret en midlertidig begrænsning, der udløser en fejlmeddelelse, der angiver:

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

Denne fejl opstår, når både normale filtre (som tilsidesætter eksisterende filtre) og filtre med de angivne KeepFilters findes i den samme tabel/klynge. Eksempler:

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 ovenstående udtryk er der to filtre i tabellen 'Geography': én med KeepFilters angivet og én uden. Disse filtre overlapper med eksterne filtre på forskellige kolonner. I øjeblikket er denne konfiguration ikke tilladt, fordi de to filtre er grupperet i et internt, og systemet kan ikke bestemme den korrekte funktionsmåde for tilsidesættelse af filteret for det grupperede filter i sådanne tilfælde.

Bemærk, at denne begrænsning er midlertidig. Vi udvikler aktivt løsninger for at fjerne denne begrænsning i fremtidige opdateringer. Hvis du støder på denne fejl, anbefaler vi, at du justerer filtrene i SummarizeColumns ved at tilføje eller fjerne KeepFilters efter behov for at sikre ensartet tilsidesættelse af funktionsmåden i hver tabel.

SAMMENFATTE