Del via


SUMMARIZECOLUMNS

Gjelder for: Beregnet beregning av beregnet tabell for beregnet tabell Mål visualobjekt

Returnerer en sammendragstabell over et sett med grupper.

Syntaks

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

Parametere

Term Definisjon
groupBy_columnName En fullstendig kolonnereferanse (Tabell[Kolonne]) til en basistabell der de distinkte verdiene er inkludert i den returnerte tabellen. Hver groupBy_columnName kolonne krysskobles (forskjellige tabeller) eller finnes automatisk (samme tabell) med de etterfølgende angitte kolonnene.
filterTable Et tabelluttrykk som legges til filterkonteksten for alle kolonner som er angitt som groupBy_columnName argumenter. Verdiene som finnes i filtertabellen, brukes til å filtrere før krysskobling/auto-eksisterer.
name En streng som representerer kolonnenavnet som skal brukes for det etterfølgende uttrykket som er angitt.
uttrykk Alle DAX-uttrykk som returnerer én enkelt verdi (ikke en tabell).

Returverdi

En tabell som inneholder kombinasjoner av verdier fra de angitte kolonnene basert på den angitte grupperingen. Bare rader der minst ett av de angitte uttrykkene returnerer en ikke-tom verdi, er inkludert i tabellen som returneres. Hvis alle uttrykk evalueres til BLANK/NULL for en rad, inkluderes ikke denne raden i tabellen som returneres.

Merknader

  • Denne funksjonen garanterer ingen sorteringsrekkefølge for resultatene.

  • En kolonne kan ikke angis mer enn én gang i parameteren groupBy_columnName. Formelen nedenfor er for eksempel ugyldig.

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

  • Denne funksjonen støttes ikke for bruk i DirectQuery-modus når den brukes i beregnede kolonner eller regler for sikkerhet på radnivå (RLS).

Filterkontekst

Vurder følgende spørring:

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

I denne spørringen, uten mål, inneholder ikke groupBy-kolonnene noen kolonner fra FILTER-uttrykket (for eksempel fra kundetabellen). Filteret brukes ikke på groupBy-kolonnene. Tabellene Salgsdistrikt og Kunde kan være indirekte relatert gjennom faktatabellen for forhandlersalg. Siden de ikke er direkte relatert, er filteruttrykket en no-op, og groupBy-kolonnene påvirkes ikke.

Men med denne spørringen:

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

GroupBy-kolonnene inneholder en kolonne som påvirkes av filteret, og dette filteret brukes på groupBy-resultatene.

Med IGNORE

IGNORE-syntaksen kan brukes til å endre virkemåten til SUMMARIZECOLUMNS-funksjonen ved å utelate bestemte uttrykk fra BLANK/NULL-evalueringen. Rader der alle uttrykk som ikke bruker IGNORE returnerer BLANK/NULL, utelates uavhengig av om uttrykkene som bruker IGNORE evalueres til BLANK/NULL eller ikke. IGNORE kan bare brukes i et SUMMARIZECOLUMNS-uttrykk.

Eksempel

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

Dette ruller opp Kolonnen Salg[CustomerId], og oppretter en delsum for alle kunder i den angitte grupperingen. Uten IGNORE er resultatet:

CustomerId Totalt antall BlankIfTotalQtyIsNot3
A 5
F 3 3
L 3 3

Med IGNORE,

CustomerId Totalt antall BlankIfTotalQtyIsNot3
F 3 3
L 3 3

Alle uttrykk ignorert,

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

Selv om begge uttrykkene returnerer tomme for noen rader, er de inkludert siden det ikke finnes noen ujusterte uttrykk som returnerer tomme.

CustomerId Tom BlankIfTotalQtyIsNot5
A 5
F
C

Med NONVISUAL

NONVISUAL-funksjonen markerer et verdifilter i SUMMARIZECOLUMNS-funksjonen som ikke påvirker målverdier, men gjelder bare for groupBy-kolonner. NONVISUAL kan bare brukes i et SUMMARIZECOLUMNS-uttrykk.

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 der [Visual Total Sales] er totalen i alle år:

DimDate[CalendarYear] [Salg] [Totalt salg for visualobjekt]
2007 9,791,060.30 29,358,677.22
2008 9,770,899.74 29,358,677.22

Den samme spørringen uten NONVISUAL-funksjonen er derimot:

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 der [Visual Total Sales] er totalen i løpet av de to valgte årene:

DimDate[CalendarYear] [Salg] [Totalt salg for visualobjekt]
2007 9,791,060.30 19,561,960.04
2008 9,770,899.74 19,561,960.04

Med ROLLUPADDISSUBTOTAL

Tillegg av ROLLUPADDISSUBTOTAL-syntaksen endrer virkemåten til SUMMARIZECOLUMNS-funksjonen ved å legge til rader for beregnet verdi/delsum i resultatet basert på groupBy_columnName kolonner. ROLLUPADDISSUBTOTAL kan bare brukes i et SUMMARIZECOLUMNS-uttrykk.

Eksempel med enkelt delsum

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 tabellen nedenfor:

Kategori Underkategori IsCategorySubtotal IsSubcategorySubtotal Totalt antall
Sann Sann 60398
Tilbehør False Sann 36092
Tilbehør Sykkelstativer False False 328
Sykler Mountain Bikes False False 4970
Klær False Sann 9101

Eksempel med flere delsummer

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

Salg grupperes etter delstat, etter kunde, etter dato, med delsummer for 1. Salg etter delstat, etter dato 2. Salg etter delstat, sortert etter kunde 3. Fremhevet på både kunde og dato som fører til salg etter delstat.

Returnerer tabellen nedenfor:

CustomerID IsCustomerSubtotal State Totalt antall Dato IsDateSubtotal
A FALSE WA 5 10.07.2014
F FALSE WA 1 10.07.2014
F FALSE WA 2 7/11/2014
C FALSE ELLER 2 10.07.2014
C FALSE ELLER 1 7/11/2014
TRUE WA 6 10.07.2014
TRUE WA 2 7/11/2014
TRUE ELLER 2 10.07.2014
TRUE ELLER 1 7/11/2014
A FALSE WA 5 TRUE
F FALSE WA 3 TRUE
C FALSE ELLER 3 TRUE
TRUE WA 8 TRUE
TRUE ELLER 3 TRUE

Med ROLLUPGROUP

Som med SUMMARIZE-funksjonen kan ROLLUPGROUP brukes sammen med ROLLUPADDISSUBTOTAL for å angi hvilke sammendragsgrupper/detaljenheter (delsummer) som skal inkluderes, noe som reduserer antallet delsumrader som returneres. ROLLUPGROUP kan bare brukes i et SUMMARIZECOLUMNS- eller SUMMARIZE-uttrykk .

Eksempel med flere delsummer

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

Fremdeles gruppert etter poststed og delstat, men sammenrullet når du rapporterer en delsum, returnerer følgende tabell:

State CustomerId IsCustomerSubtotal Totalt antall City IsCityStateSubtotal
WA A FALSE 2 Bellevue FALSE
WA F FALSE 2 Bellevue FALSE
WA A FALSE 3 Sandvika FALSE
WA F FALSE 1 Sandvika FALSE
ELLER C FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Sandvika FALSE
ELLER TRUE 3 Portland FALSE
A FALSE 5 FALSE
F FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

Kontekstavhengige SummarizeColumns

Bakgrunn

Frem til februar 2023 støttet ikke SUMMARIZECOLUMNS evaluering i en kontekstovergang i det hele tatt. I produkter som ble utgitt før denne måneden, gjorde denne begrensningen SUMMARIZECOLUMNS ikke nyttig i de fleste målene – det var ikke mulig å kalle et mål SUMMARIZECOLUMNS i tilfelle kontekstovergang, inkludert andre SUMMARIZECOLUMNS-setninger.

Fra februar 2023 ble kontekstovergangen støttet i noen få scenarioer, men ikke under alle betingelsene. De støttede og begrensede sakene er som følger:

SummarizeColumns Type Eksternt filter med én kolonne Eksternt filter med mer enn én kolonne Eksterne GroupBy-kolonner
SummarizeColumns med Bare GroupBy OK OK OK
SummarizeColumns med filtre/mål OK FEIL FEIL

Fra juni 2024 aktiverer vi kontekstavhengige SummarizeColumns som gjør at SummarizeColumns kan evalueres i enhver kontekstovergang, summarizeColumns i mål støttes nå fullt ut:

SummarizeColumns Type Eksternt filter med én kolonne Eksternt filter med mer enn én kolonne Eksterne GroupBy-kolonner
SummarizeColumns med Bare GroupBy OK OK OK
SummarizeColumns med filtre/mål OK OK OK

Denne oppdateringen inneholder imidlertid også endringer i virkemåten til SummarizeColumns, som kan endre resultatene av eksisterende uttrykk:

SelfValue-semantikk for eksterne filtre

Vi introduserer et semantisk konsept kalt SelfValue, som endrer hvordan filtre fra eksterne tabeller samhandler med GroupBy-kolonner i SummarizeColumns. Denne endringen tillater ikke filtre fra en annen tabell for å påvirke GroupBy-kolonnene, selv om tabellene er relatert gjennom en filter-etter-relasjon. Et eksempel som illustrerer virkningen av denne endringen innebærer følgende uttrykk:

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

Før denne oppdateringen vil TreatAs-filteret gjelde for GroupBy-operasjonen i SummarizeColumns, og utnytte relasjonen mellom «Produkt»[Produktnøkkel] og Forhandlersalg[ProductKey]. Resultatet av spørringen inkluderer derfor bare rader der «Forhandlersalg»[ProductKey] er lik 229. Etter oppdateringen filtreres imidlertid ikke Lenger GroupBy-kolonner i SummarizeColumns etter kolonner fra eksterne tabeller, selv om det finnes en relasjon mellom dem. I eksemplet ovenfor blir derfor ikke GroupBy-kolonnen Forhandlersalg[ProductKey] filtrert etter «Produkt»[ProductKey]-kolonnen. Som et resultat vil spørringen inneholde rader der «Forhandlersalg»[ProductKey] ikke er lik 229.

Hvis du foretrekker å beholde den forrige virkemåten, kan du skrive om uttrykket ved hjelp av AddColumns eller SelectColumns i stedet for SummarizeColumns, som vist nedenfor:

CalculateTable(
    Filter(
        SelectColumns(
            'Reseller Sales',
            "ResellerKey", 
            [ResellerKey],
            "ProductKey",
            [ProductKey]
        ),
        And(Not IsBlank([ResellerKey]),  Not IsBlank([ProductKey]))
    ),
    Treatas({(229)}, 'Product'[Product Key])
)

Dette omskrevne uttrykket bevarer de opprinnelige semantikkene der GroupBy-operasjonen ikke påvirkes av SelfValue-begrensningen som ble innført av oppdateringen.

Radvalidering for groupby-kolonner fullstendig dekket av Treatas

Før denne oppdateringen, i en SummarizeColumns-funksjon, hvis alle GroupBy-kolonner fra en bestemt tabell var fullstendig dekket av et enkelt Treatas-filter fra den samme tabellen, som vist nedenfor:

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

Resultatet av spørringen ovenfor inkluderer de radene som ble angitt i Treatas-filteret, uavhengig av om de var gyldige eller ikke. Resultatet vil for eksempel være en enkeltradstabell ("USA", "Alberta"), selv om ingen slik rad med [Land] = "USA" og [Stat] = "Alberta" eksisterte i geografitabellen.

Dette problemet ble kjent og er løst av oppdateringen. Etter oppdateringen filtreres slike ugyldige rader ut, og bare gyldige rader fra GroupBy-tabellen returneres. Resultatet for spørringen ovenfor vil derfor være tomt, da det ikke finnes noen gyldige rader som samsvarer med de angitte verdiene [Land] og [Delstat] i Geografi-tabellen.

Ikke tillat blandede Keepfilters/overstyrte filtre i samme tabell/klynge

Den nylige oppdateringen har innført en midlertidig begrensning som utløser en feilmelding som sier:

"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 feilen oppstår når både normale filtre (som overstyrer eksisterende filtre) og filtre med Angitte KeepFilters finnes i samme tabell/klynge. Eksempel:

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 uttrykket ovenfor er det to filtre i Geografi-tabellen: én med KeepFilters angitt og én uten. Disse filtrene overlapper med eksterne filtre på forskjellige kolonner. Denne konfigurasjonen er for øyeblikket ikke tillatt fordi de to filtrene internt er gruppert i én, og systemet kan ikke bestemme riktig virkemåte for filteroverstyring for det grupperte filteret generelt i slike tilfeller.

Vær oppmerksom på at denne begrensningen er midlertidig. Vi utvikler aktivt løsninger for å fjerne denne begrensningen i fremtidige oppdateringer. Hvis du støter på denne feilen, anbefaler vi at du justerer filtrene i SummarizeColumns ved å legge til eller fjerne KeepFilters etter behov for å sikre konsekvent overordnet virkemåte på hver tabell.

OPPSUMMERE