SUMMARIZECOLUMNS
s’applique à :colonne calculéetable calculéeMeasurecalcul visuel
Retourne une table récapitulative sur un ensemble de groupes.
Syntaxe
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
Paramètres
Terme | Définition |
---|---|
groupBy_columnName |
Référence de colonne complète (Table[Colonne]) à une table de base pour laquelle les values distinctes sont incluses dans la table retournée. Chaque colonne groupBy_columnName est jointe à plusieurs (tables différentes) or existait automatiquement (même table) avec les colonnes spécifiées suivantes. |
filterTable |
Expression de table ajoutée au contexte filter de all colonnes spécifiées en tant qu’arguments groupBy_columnName. Les values présentes dans la table filter sont utilisées pour filter avant l’exécution de la jointure croisée/de l’existence automatique. |
name |
Chaîne représentant le nom de colonne à utiliser pour l’expression suivante spécifiée. |
expression |
Toute expression DAX qui retourne une seule value (not une table). |
Retourner value
Table qui comprend des combinaisons de values à partir des colonnes fournies en fonction du regroupement spécifié. Seules les lignes pour lesquelles au moins une des expressions fournies retournent une non-blankvalue sont incluses dans la table retournée. If all expressions evaluate à BLANK/NULL pour une ligne, cette ligne est not incluse dans la table retournée.
Remarques
Cette fonction n'not garantir tout ordre de tri pour les résultats.
Une colonne ne peut pas être spécifiée plusieurs fois dans le paramètre groupBy_columnName. Par exemple, la formule suivante n’est pas valide.
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
Cette fonction est not prise en charge pour une utilisation en mode DirectQuery lorsqu’elle est utilisée dans les colonnes calculées or règles de sécurité au niveau des lignes (RLS).
contexte Filter
Considérez la requête suivante :
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
Dans cette requête, sans measure les colonnes groupBy ne contiennent not aucune colonne de l’expression FILTER (par exemple, à partir de la table Customer). La filter est not appliquée aux colonnes groupBy. Les tables Sales Territory and Customer peuvent être indirectement related par le biais de la table reseller sales fact. Étant donné qu’elles sont not directement related, l’expression filter est une no-op and les colonnes groupBy sont not affectées.
Toutefois, avec cette requête :
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
Les colonnes groupBy contiennent une colonne qui est affectée par la filterandfilter appliquée aux résultats groupBy.
Avec IGNORE
La syntaxe IGNORE peut être utilisée pour modifier le comportement de la fonction SUMMARIZECOLUMNS en omettant des expressions spécifiques de l’évaluation BLANK/NULL. Les lignes pour lesquelles les expressions allnot à l’aide de IGNORE retour BLANK/NULL sont exclues indépendamment de l’exclusion des expressions qui utilisent IGNOREevaluate pour BLANK/NULL ornot. IGNORE ne peut être utilisé qu’au sein d’une expression SUMMARIZECOLUMNS.
Exemple
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
Cette opération cumule la colonne Sales[CustomerId], en créant un sous-total pour all clients dans le regroupement donné. Sans IGNORE, le résultat est :
CustomerId | Total Qty | BlankIfTotalQtyIsNot3 |
---|---|---|
A | 5 | |
B | 3 | 3 |
C | 3 | 3 |
Avec IGNORE,
CustomerId | Total Qty | BlankIfTotalQtyIsNot3 |
---|---|---|
B | 3 | 3 |
C | 3 | 3 |
expression All ignorée,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Even bien que les deux expressions retournent blank pour certaines lignes, elles sont incluses, car il n’existe aucune expression non ignorée qui retourne blank.
CustomerId | Blank | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
Avec NONVISUAL
La fonction NONVISUAL marque une valuefilter dans SUMMARIZECOLUMNS fonction comme not affectant measurevalues, mais s’applique uniquement aux colonnes groupBy. NONVISUAL ne peut être utilisé qu’au sein d’une expression SUMMARIZECOLUMNS.
Exemple
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]
Retourne le résultat où [Visual Total Sales] est le total entre all ans :
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9 791 060,30 | 29 358 677,22 |
2008 | 9 770 899,74 | 29 358 677,22 |
En revanche, la même requête sans la fonction 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]
Retourne le résultat où [Visual Total Sales] correspond au total sur les deux années sélectionnées :
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9 791 060,30 | 19 561 960,04 |
2008 | 9 770 899,74 | 19 561 960,04 |
Avec ROLLUPADDISSUBTOTAL
L’ajout de la syntaxe ROLLUPADDISSUBTOTAL modifie le comportement de la fonction SUMMARIZECOLUMNS en ajoutant rolluplignes /subtotal au résultat en fonction des colonnes groupBy_columnName. ROLLUPADDISSUBTOTAL ne peut être utilisé qu’au sein d’une expression SUMMARIZECOLUMNS.
Exemple avec un sous-total unique
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]
Retourne la table suivante :
Category | Sous-catégorie | IsCategorySubtotal | IsSubcategorySubtotal | Total Qty |
---|---|---|---|---|
True | True | 60398 | ||
Accessories | False | True | 36092 | |
Accessories | Porte-vélos | False | False | 328 |
Bikes | VTT | False | False | 4970 |
Clothing | False | True | 9101 |
Exemple avec plusieurs sous-totaux
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
Les ventes sont regroupées par état, par client, par date, avec des sous-totaux pour 1. Ventes par état, par date 2. Ventes par région, par client 3. Inscrit sur les deux anddate client menant aux ventes par état.
Retourne la table suivante :
CustomerID | IsCustomerSubtotal | State | Total Qty | Date | IsDateSubtotal |
---|---|---|---|---|---|
A | FALSE |
WA | 5 | 7/10/2014 | |
B | FALSE |
WA | 1 | 7/10/2014 | |
B | FALSE |
WA | 2 | 7/11/2014 | |
C | FALSE |
OR | 2 | 7/10/2014 | |
C | FALSE |
OR | 1 | 7/11/2014 | |
TRUE |
WA | 6 | 7/10/2014 | ||
TRUE |
WA | 2 | 7/11/2014 | ||
TRUE |
OR | 2 | 7/10/2014 | ||
TRUE |
OR | 1 | 7/11/2014 | ||
A | FALSE |
WA | 5 | TRUE |
|
B | FALSE |
WA | 3 | TRUE |
|
C | FALSE |
OR | 3 | TRUE |
|
TRUE |
WA | 8 | TRUE |
||
TRUE |
OR | 3 | TRUE |
Avec ROLLUPGROUP
Comme avec la fonction SUMMARIZE, ROLLUPGROUP pouvez être utilisé avec ROLLUPADDISSUBTOTAL pour spécifier les groupes de synthèse/granularités (sous-totaux) à inclure, ce qui réduit le nombre de lignes de sous-total retournées. ROLLUPGROUP ne peut être utilisé qu’au sein d’une expression SUMMARIZECOLUMNSorSUMMARIZE.
Exemple avec plusieurs sous-totaux
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
Toujours regroupé par City and State, mais roulé ensemble lors de la création d’un sous-total retourne le tableau suivant,
State | CustomerId | IsCustomerSubtotal | Total Qty | City | IsCityStateSubtotal |
---|---|---|---|---|---|
WA | A | FALSE |
2 | Bellevue | FALSE |
WA | B | FALSE |
2 | Bellevue | FALSE |
WA | A | FALSE |
3 | Redmond | FALSE |
WA | B | FALSE |
1 | Redmond | FALSE |
OR | C | FALSE |
3 | Portland | FALSE |
WA | TRUE |
4 | Bellevue | FALSE |
|
WA | TRUE |
4 | Redmond | FALSE |
|
OR | TRUE |
3 | Portland | FALSE |
|
A | FALSE |
5 | FALSE |
||
B | FALSE |
3 | TRUE |
||
C | FALSE |
3 | TRUE |
||
TRUE |
11 | TRUE |
SummarizeColumns contextuelle
Background
Jusqu’en février 2023, SUMMARIZECOLUMNS a not l’évaluation du soutien dans le cadre d’une transition contextuelle à all. Dans les produits publiés avant cette month, cette limitation a rendu SUMMARIZECOLUMNSnot utile dans la plupart des mesures , il était not possible d’appeler un measureSUMMARIZECOLUMNS dans tout cas de transition de contexte, y compris d’autres SUMMARIZECOLUMNSstatements.
À partir de février 2023, la transition de contexte a été prise en charge dans quelques scénarios, mais not dans all les conditions. Les cas restreints pris en charge and sont les suivants :
type de SummarizeColumns | Filter externe avec une seule colonne | Filter externe avec plusieurs colonnes | Colonnes GroupBy externes |
---|---|---|---|
SummarizeColumns avec GroupBy uniquement | OK | OK | OK |
SummarizeColumns avec Filters/Mesures | OK | ERROR | ERROR |
À partir de juin 2024, nous activons des SummarizeColumns contextuelles qui permettent SummarizeColumns d’être évaluées dans n’importe quelle transition de contexte, SummarizeColumns dans measure est now entièrement prise en charge :
type de SummarizeColumns | Filter externe avec une seule colonne | Filter externe avec plusieurs colonnes | Colonnes GroupBy externes |
---|---|---|---|
SummarizeColumns avec GroupBy uniquement | OK | OK | OK |
SummarizeColumns avec Filters/Mesures | OK | OK | OK |
Toutefois, cette mise à jour inclut également des modifications apportées au comportement de SummarizeColumns, ce qui peut modifier les résultats des expressions existantes :
Sémantique SelfValue pour les filters externes
Nous introduisons un concept sémantique nommé SelfValue, qui modifie la façon dont filters des tables externes interagissent avec les colonnes GroupBy dans SummarizeColumns. Cette modification interdit filters d’une autre table pour affecter les colonnes GroupBy, evenif les tables sont related par le biais d’une relation de filter. Un exemple illustrant l’impact de cette modification implique l’expression suivante :
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Avant cette mise à jour, la TreatAsfilter s’appliquerait à l’opération de GroupBy dans SummarizeColumns, en tirant parti de la relation entre 'Product'[Product Key] and 'Reseller Sales'[ProductKey]. Par conséquent, les résultats de la requête incluaient uniquement les lignes où « Reseller Sales » [ProductKey] est égal à 229. Toutefois, après la mise à jour, GroupBy colonnes dans SummarizeColumns ne seront plus filtrées par colonnes à partir de tables externes, evenif une relation existe entre elles. Par conséquent, dans l’exemple ci-dessus, la colonne GroupBy « Reseller Sales » [ProductKey] not être filtrée par la colonne «Product« [ProductKey] ». Par conséquent, la requête inclut des lignes où « Reseller Sales » [ProductKey] est not égal à 229.
If vous préférez conserver le comportement previous, vous pouvez réécrire l’expression à l’aide de Summarize au lieu de SummarizeColumns, comme indiqué ci-dessous :
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Cette expression réécrite conserve la sémantique d’origine où l’opération de GroupBy est not affectée par la restriction SelfValue introduite par la mise à jour.
Validation de ligne pour les colonnes groupby entièrement couvertes par Treatas
Avant cette mise à jour, dans une fonction SummarizeColumns, ifallGroupBy colonnes d’une table spécifique ont été entièrement couvertes par une seule Treatasfilter de cette même table, comme indiqué ci-dessous :
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
Le résultat de la requête ci-dessus inclurait les lignes spécifiées dans le Treatasfilter, qu’elles soient valides ornot. Par exemple, le résultat serait une table à une seule ligne (« États-Unis », « Alberta »), evenif aucune ligne de ce type avec [Country] = « États-Unis » and [State] = « Alberta » existait dans la table « Geography ».
Ce problème a été connu and a été résolu par la mise à jour. Après la mise à jour, ces lignes non valides sont filtrées, and seules les lignes valides de la table GroupBy sont retournées. Par conséquent, le résultat de la requête ci-dessus est vide, car il n’existe aucune ligne valide correspondant au [Pays] spécifié and [État] values dans la table « Geography ».
Interdire les Keepfiltersmixtes /substitutiondefilters sur la même table/cluster
La mise à jour récente a introduit une restriction temporaire qui déclenche un message error indiquant :
"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."
Cette error se produit lorsque les deux filters normaux (qui remplacent les filtersexistants) andfilters avec KeepFilters spécifié sont présents dans la même table/cluster. Par exemple :
Evaluate CalculateTable(
SummarizeColumns(
Product[Color],
KeepFilters(
TreatAs(
{( "Washington")}
, Geography[State]
)
),
TreatAs(
{("United States"), ("Canada")}
, Geography[Country]
)
)
,TreatAs({("Alberta")}, Geography[State])
,TreatAs({("Canada")}, Geography[Country])
)
Dans l’expression ci-dessus, il existe deux filters sur la table « Geography » : une avec KeepFilters spécifiée and une sans. Ces filters chevauchent des filters externes sur différentes colonnes. Actuellement, cette configuration est not autorisée, car en interne, les deux filters sont en cluster en un, and le système ne peut pas déterminer le comportement correct filter de substitution du filter cluster dans ce cas.
Notez que cette restriction est temporaire. Nous développons activement des solutions pour supprimer cette limitation dans les prochaines mises à jour. If vous rencontrez cette error, nous vous conseillons d’ajuster la filters dans SummarizeColumns en ajoutant or suppression de KeepFilters si nécessaire pour garantir un comportement de substitution cohérent sur chaque table.