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. |
name |
Een tekenreeks die de kolomnaam vertegenwoordigt die moet worden gebruikt voor de volgende expressie die is opgegeven. |
expression |
Elke 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 resulteren in BLANK/NULL voor een rij, 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 zonder meting 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 IGNORE syntaxis kan worden gebruikt om het gedrag van de SUMMARIZECOLUMNS functie te wijzigen door specifieke expressies weg te laten uit de BLANK/NULL-evaluatie. Rijen waarvoor alle expressies die niet gebruikmaken van IGNOREBLANK/NULL retourneren, worden uitgesloten van het feit of de expressies die wel IGNORE gebruiken, 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 IGNOREis 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 | Blanco | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
E |
Met NONVISUAL
De functie NONVISUAL markeert een waardefilter in SUMMARIZECOLUMNS functie 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 ROLLUPADDISSUBTOTAL syntaxis wijzigt het gedrag van de SUMMARIZECOLUMNS functie 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 | Vals | Waar | 36092 | |
Accessoires | Fietsenrekken | Vals | Vals | 328 |
Fietsen | Mountainbikes | Vals | Vals | 4970 |
Kleding | Vals | 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 |
OR | 2 | 10-7-2014 | |
E | FALSE |
OR | 1 | 7/11/2014 | |
TRUE |
WA | 6 | 10-7-2014 | ||
TRUE |
WA | 2 | 7/11/2014 | ||
TRUE |
OR | 2 | 10-7-2014 | ||
TRUE |
OR | 1 | 7/11/2014 | ||
A | FALSE |
WA | 5 | TRUE |
|
B | FALSE |
WA | 3 | TRUE |
|
E | FALSE |
OR | 3 | TRUE |
|
TRUE |
WA | 8 | TRUE |
||
TRUE |
OR | 3 | TRUE |
Met ROLLUPGROUP
Net als bij 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 |
OR | E | FALSE |
3 | Portland | FALSE |
WA | TRUE |
4 | Bellevue | FALSE |
|
WA | TRUE |
4 | Amsterdam | FALSE |
|
OR | 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 aan te roepen SUMMARIZECOLUMNS 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 | ERROR | ERROR |
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 Summarize in plaats van SummarizeColumns, zoals hieronder wordt weergegeven:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[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.