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 Summarize i stedet for SummarizeColumns, som vist nedenfor:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[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.