Delen via


SUMMARIZECOLUMNS

Van toepassing op: Berekende kolom Berekende tabel Meting Visuele berekening

Retourneert een samenvattingstabel over een set groepen.

Syntaxis

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

Parameters

Term Definitie
groupBy_columnName Een volledig gekwalificeerde kolomreferentie (Tabel[Kolom]) naar een basistabel waarvoor de afzonderlijke waarden zijn opgenomen in de geretourneerde tabel. Elke groupBy_columnName kolom is gekoppeld (verschillende tabellen) of bestaat automatisch (dezelfde tabel) met de volgende opgegeven kolommen.
filterTable Een tabelexpressie die wordt toegevoegd aan de filtercontext van alle kolommen die zijn opgegeven als groupBy_columnName argumenten. De waarden in de filtertabel worden gebruikt om te filteren voordat cross-join/auto-exist wordt uitgevoerd.
naam Een tekenreeks die de kolomnaam vertegenwoordigt die moet worden gebruikt voor de volgende expressie die is opgegeven.
uitdrukking Een DAX-expressie die één waarde retourneert (geen tabel).

Retourwaarde

Een tabel met combinaties van waarden uit de opgegeven kolommen op basis van de opgegeven groepering. Alleen rijen waarvoor ten minste één van de opgegeven expressies een niet-lege waarde retourneert, worden opgenomen in de geretourneerde tabel. Als alle expressies BLANK/NULL voor een rij opleveren, wordt die rij niet opgenomen in de geretourneerde tabel.

Opmerkingen

  • Deze functie garandeert geen sorteervolgorde voor de resultaten.

  • Een kolom kan niet meer dan één keer worden opgegeven in de parameter groupBy_columnName. De volgende formule is bijvoorbeeld ongeldig.

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

  • Deze functie wordt niet ondersteund voor gebruik in de DirectQuery-modus wanneer deze wordt gebruikt in regels voor beveiliging op rijniveau (berekende kolommen of beveiliging op rijniveau).

Filtercontext

Houd rekening met de volgende query:

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

In deze query bevatten de groupBy-kolommen geen kolommen uit de FILTER-expressie (bijvoorbeeld uit de tabel Customer). Het filter wordt niet toegepast op de groupBy-kolommen. De tabellen Verkoopgebied en Klant kunnen indirect zijn gerelateerd via de feitentabel Reseller sales. Omdat ze niet rechtstreeks zijn gerelateerd, is de filterexpressie een no-op en worden de groupBy-kolommen niet beïnvloed.

Met deze query doet u echter het volgende:

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

De groupBy-kolommen bevatten een kolom die wordt beïnvloed door het filter en dat filter wordt toegepast op de groupBy-resultaten.

Met IGNORE

De syntaxis IGNORE kan worden gebruikt om het gedrag van de functie SUMMARIZECOLUMNS te wijzigen door specifieke expressies weg te laten uit de BLANK/NULL-evaluatie. Rijen waarvoor alle expressies die niet gebruikmaken van IGNORE, retourneren BLANK/NULL, worden uitgesloten, ongeacht of de expressies waarvoor IGNORE wordt gebruikt, blank/NULL opleveren of niet. IGNORE kan alleen worden gebruikt binnen een SUMMARIZECOLUMNS-expressie.

Opmerking

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

Hiermee wordt de kolom Sales[CustomerId] opgerold, waarmee een subtotaal wordt gemaakt voor alle klanten in de opgegeven groepering. Zonder IGNORE is het resultaat:

CustomerId Totaal aantal BlankIfTotalQtyIsNot3
A 5
B 3 3
E 3 3

Met IGNORE,

CustomerId Totaal aantal BlankIfTotalQtyIsNot3
B 3 3
E 3 3

Alle expressies genegeerd,

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

Hoewel beide expressies leeg retourneren voor sommige rijen, worden ze opgenomen omdat er geen niet-gnored expressies zijn die leeg retourneren.

CustomerId Leeg BlankIfTotalQtyIsNot5
A 5
B
E

Met NONVISUAL

De functie NONVISUAL markeert een waardefilter in de functie SUMMARIZECOLUMNS als niet van invloed op meetwaarden, maar alleen van toepassing op groupBy-kolommen. NONVISUAL kan alleen worden gebruikt binnen een SUMMARIZECOLUMNS-expressie.

Opmerking

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]

Retourneert het resultaat waarbij [Visual Total Sales] het totaal is voor alle jaren:

DimDate[CalendarYear] [Sales] [Totale verkoop van visuals]
2007 9,791,060.30 29,358,677.22
2008 9,770,899.74 29,358,677.22

Dezelfde query daarentegen zonder de functie 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]

Retourneert het resultaat waarbij [Visual Total Sales] het totaal is voor de twee geselecteerde jaren:

DimDate[CalendarYear] [Sales] [Totale verkoop van visuals]
2007 9,791,060.30 19,561,960.04
2008 9,770,899.74 19,561,960.04

Met ROLLUPADDISSUBTOTAL

De toevoeging van de syntaxis ROLLUPADDISSUBTOTAL wijzigt het gedrag van de functie SUMMARIZECOLUMNS door samengetelde/subtotaalrijen toe te voegen aan het resultaat op basis van de groupBy_columnName kolommen. ROLLUPADDISSUBTOTAL kan alleen worden gebruikt binnen een SUMMARIZECOLUMNS-expressie.

Voorbeeld met één subtotaal

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]

Retourneert de volgende tabel,

Categorie Subcategorie IsCategorySubtotal IsSubcategorySubtotal Totaal aantal
Waar Waar 60398
Accessoires Onwaar Waar 36092
Accessoires Fietsenrekken Onwaar Onwaar 328
Fietsen Mountainbikes Onwaar Onwaar 4970
Kleding Onwaar Waar 9101

Voorbeeld met meerdere subtotalen

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

Verkoop wordt gegroepeerd op staat, per klant, op datum, met subtotalen voor 1. Verkoop per staat, op datum 2. Verkoop per staat, per klant 3. Samengeteld op zowel de klant als de datum die leidt tot de verkoop per staat.

Retourneert de volgende tabel,

CustomerID IsCustomerSubtotal Provincie Totaal aantal Datum IsDateSubtotal
A FALSE WA 5 10-7-2014
B FALSE WA 1 10-7-2014
B FALSE WA 2 7/11/2014
E FALSE OF 2 10-7-2014
E FALSE OF 1 7/11/2014
TRUE WA 6 10-7-2014
TRUE WA 2 7/11/2014
TRUE OF 2 10-7-2014
TRUE OF 1 7/11/2014
A FALSE WA 5 TRUE
B FALSE WA 3 TRUE
E FALSE OF 3 TRUE
TRUE WA 8 TRUE
TRUE OF 3 TRUE

Met ROLLUPGROUP

Net als met de functie SUMMARIZE kan ROLLUPGROUP samen met ROLLUPADDISSUBTOTAL worden gebruikt om op te geven welke samenvattingsgroepen/granulariteiten (subtotalen) moeten worden opgenomen, waardoor het aantal geretourneerde subtotaalrijen wordt verminderd. ROLLUPGROUP kan alleen worden gebruikt binnen een SUMMARIZECOLUMNS- of SUMMARIZE-expressie .

Voorbeeld met meerdere subtotalen

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

Nog steeds gegroepeerd op plaats en staat, maar samengeteld bij het rapporteren van een subtotaal retourneert de volgende tabel,

Provincie CustomerId IsCustomerSubtotal Totaal aantal City IsCityStateSubtotal
WA A FALSE 2 Bellevue FALSE
WA B FALSE 2 Bellevue FALSE
WA A FALSE 3 Amsterdam FALSE
WA B FALSE 1 Amsterdam FALSE
OF E FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Amsterdam FALSE
OF TRUE 3 Portland FALSE
A FALSE 5 FALSE
B FALSE 3 TRUE
E FALSE 3 TRUE
TRUE 11 TRUE

Contextuele SummarizeColumns

Achtergrond

Tot februari 2023 biedt SUMMARIZECOLUMNS helemaal geen ondersteuning voor evaluatie binnen een contextovergang. In producten die vóór die maand werden uitgebracht, maakte deze beperking SUMMARIZECOLUMNS niet nuttig in de meeste metingen: het was niet mogelijk om een meting SUMMARIZECOLUMNS aan te roepen in elk geval van contextovergang, inclusief andere SUMMARIZECOLUMNS-instructies.

Vanaf februari 2023 werd de contextovergang in een aantal scenario's ondersteund, maar niet in alle voorwaarden. De ondersteunde en beperkte gevallen zijn als volgt:

SummarizeColumns-type Extern filter met één kolom Extern filter met meer dan één kolom Externe GroupBy-kolommen
SummarizeColumns met alleen GroupBy OK OK OK
SummarizeColumns met filters/metingen OK FOUT FOUT

Vanaf juni 2024 schakelen we contextuele SummarizeColumns in, zodat SummarizeColumns in elke contextovergang kunnen worden geëvalueerd. SummarizeColumns in meting wordt nu volledig ondersteund:

SummarizeColumns-type Extern filter met één kolom Extern filter met meer dan één kolom Externe GroupBy-kolommen
SummarizeColumns met alleen GroupBy OK OK OK
SummarizeColumns met filters/metingen OK OK OK

Deze update bevat echter ook wijzigingen in het gedrag van SummarizeColumns, waardoor de resultaten van bestaande expressies kunnen worden gewijzigd:

SelfValue-semantiek voor externe filters

We introduceren een semantisch concept met de naam SelfValue, waarmee wordt gewijzigd hoe filters van externe tabellen communiceren met GroupBy-kolommen in SummarizeColumns. Deze wijziging staat filters uit een andere tabel niet toe om invloed te hebben op de GroupBy-kolommen, zelfs als de tabellen zijn gerelateerd via een filter-op-relatie. Een voorbeeld van de impact van deze wijziging omvat de volgende expressie:

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

Vóór deze update zou het filter TreatAs van toepassing zijn op de GroupBy-bewerking in SummarizeColumns, waarbij gebruik wordt gemaakt van de relatie tussen 'Product'[Productcode] en 'Reseller Sales'[ProductKey]. De queryresultaten bevatten dus alleen rijen waarbij Reseller Sales[ProductKey] gelijk is aan 229. Na de update worden GroupBy-kolommen in SummarizeColumns echter niet meer gefilterd op kolommen uit externe tabellen, zelfs als er een relatie tussen deze kolommen bestaat. Daarom wordt in het bovenstaande voorbeeld de kolom GroupBy Reseller Sales[ProductKey] niet gefilterd op de kolom Product[ProductKey]. Als gevolg hiervan bevat de query rijen waarbij Reseller Sales[ProductKey] niet gelijk is aan 229.

Als u liever het vorige gedrag behoudt, kunt u de expressie herschrijven met Behulp van AddColumns of SelectColumns in plaats van SummarizeColumns, zoals hieronder wordt weergegeven:

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

Deze herschreven expressie behoudt de oorspronkelijke semantiek waarbij de GroupBy-bewerking niet wordt beïnvloed door de SelfValue-beperking die door de update is geïntroduceerd.

Rijvalidatie voor groupby-kolommen die volledig worden gedekt door Treatas

Vóór deze update, binnen een functie SummarizeColumns, als alle GroupBy-kolommen uit een specifieke tabel volledig werden gedekt door één Treatas-filter uit dezelfde tabel, zoals hieronder wordt weergegeven:

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

Het resultaat van de bovenstaande query zou alle rijen bevatten die zijn opgegeven in het Filter Treatas, ongeacht of ze geldig zijn of niet. Het resultaat is bijvoorbeeld een tabel met één rij ('Verenigde Staten', 'Alberta'),, zelfs als er geen rij met [Land] = "Verenigde Staten" en [Staat] = "Alberta" bestaat in de tabel Geografie.

Dit probleem is bekend en is opgelost door de update. Na de update worden dergelijke ongeldige rijen uitgefilterd en worden alleen geldige rijen uit de GroupBy-tabel geretourneerd. Daarom is het resultaat voor de bovenstaande query leeg, omdat er geen geldige rijen zijn die overeenkomen met de opgegeven waarden [Land] en [Staat] in de tabel Geografie.

Gemengde Keepfilters/overridedefilters op dezelfde tabel/cluster niet inschakelen

De recente update heeft een tijdelijke beperking geïntroduceerd waarmee een foutbericht wordt geactiveerd met de mededeling:

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

Deze fout treedt op wanneer zowel normale filters (die bestaande filters overschrijven) als filters met KeepFilters opgegeven aanwezig zijn in dezelfde tabel/cluster. Voorbeeld:

Evaluate CalculateTable(
  SummarizeColumns(
      Product[Color],
      KeepFilters(
          TreatAs(
              {( "Washington")}
              , Geography[State]
          )
      ),
      TreatAs(
          {("United States"), ("Canada")}
          , Geography[Country]
      )
  )
  ,TreatAs({("Alberta")}, Geography[State])
  ,TreatAs({("Canada")}, Geography[Country])
)

In de bovenstaande expressie zijn er twee filters in de tabel Geografie: één met KeepFilters opgegeven en één zonder. Deze filters overlappen met externe filters in verschillende kolommen. Deze configuratie is momenteel niet toegestaan, omdat de twee filters intern in één zijn geclusterd en het systeem in dergelijke gevallen niet het juiste filteroverschrijvend gedrag kan bepalen voor het geclusterde filter.

Houd er rekening mee dat deze beperking tijdelijk is. We ontwikkelen actief oplossingen om deze beperking in toekomstige updates te verwijderen. Als deze fout optreedt, raden we u aan de filters in SummarizeColumns aan te passen door KeepFilters indien nodig toe te voegen of te verwijderen om consistent overschrijvend gedrag voor elke tabel te garanderen.

SAMENVATTEN