SUMMARIZECOLUMNS
s’applique à :colonne calculéetable calculéemesurecalcul 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 valeurs distinctes sont incluses dans la table retournée. Chaque colonne groupBy_columnName est jointe à plusieurs (tables différentes) ou existe automatiquement (même table) avec les colonnes spécifiées suivantes. |
filterTable |
Expression de table qui est ajoutée au contexte de filtre de toutes les colonnes spécifiées en tant qu’arguments groupBy_columnName. Les valeurs présentes dans la table de filtres sont utilisées pour filtrer 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 valeur unique (et non une table). |
Valeur de retour
Table qui inclut des combinaisons de valeurs à partir des colonnes fournies en fonction du regroupement spécifié. Seules les lignes pour lesquelles au moins une des expressions fournies retournent une valeur non vide sont incluses dans la table retournée. Si toutes les expressions sont évaluées à BLANK/NULL pour une ligne, cette ligne n’est pas incluse dans la table retournée.
Remarques
Cette fonction ne garantit aucun 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 n’est pas prise en charge pour une utilisation en mode DirectQuery lorsqu’elle est utilisée dans les colonnes calculées ou les règles de sécurité au niveau des lignes (RLS).
Contexte de filtre
Considérez la requête suivante :
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
Dans cette requête, sans mesure, les colonnes groupBy ne contiennent aucune colonne de l’expression FILTER (par exemple, à partir de la table Customer). Le filtre n’est pas appliqué aux colonnes groupBy. Les tables Sales Territory et Customer peuvent être indirectement liées par le biais de la table de faits reseller sales. Étant donné qu’elles ne sont pas directement liées, l’expression de filtre est une no-op et les colonnes groupBy ne sont pas 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 affectée par le filtre et ce filtre est appliqué 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 toutes les expressions qui n’utilisent pas IGNORE retour BLANK/NULL sont exclues indépendamment si les expressions qui utilisent IGNORE évaluer BLANK/NULL ou non. 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 tous les clients du 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 |
Toutes les expressions ignorées,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Même si les deux expressions retournent vides pour certaines lignes, elles sont incluses, car il n’existe aucune expression non ignorée qui retourne vide.
CustomerId | Blanc | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
Avec NONVISUAL
La fonction NONVISUAL marque un filtre de valeurs dans SUMMARIZECOLUMNS fonction comme n’affectant pas les valeurs de mesure, 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 sur toutes les années :
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 des lignes de cumul/sous-total 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 |
---|---|---|---|---|
Vrai | Vrai | 60398 | ||
Accessories | Faux | Vrai | 36092 | |
Accessories | Porte-vélos | Faux | Faux | 328 |
Bikes | VTT | Faux | Faux | 4970 |
Clothing | Faux | Vrai | 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 à la fois sur le client et à la date 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é que dans une expression SUMMARIZECOLUMNS ou SUMMARIZE.
Exemple avec plusieurs sous-totaux
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
Toujours regroupés par ville et état, mais roulés 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 contextuels
Background
Jusqu’en février 2023, SUMMARIZECOLUMNS ne prenait pas en charge l’évaluation dans le cadre d’une transition contextuelle du tout. Dans les produits publiés avant ce mois-ci, cette limitation n’a SUMMARIZECOLUMNS pas utile dans la plupart des mesures : il n’était pas possible d’appeler une mesure SUMMARIZECOLUMNS en cas de transition de contexte, y compris d’autres déclarations de SUMMARIZECOLUMNS.
À partir de février 2023, la transition de contexte a été prise en charge dans quelques scénarios, mais pas dans toutes les conditions. Les cas pris en charge et restreints sont les suivants :
SummarizeColumns Type | Filtre externe avec une seule colonne | Filtre externe avec plusieurs colonnes | Colonnes GroupBy externes |
---|---|---|---|
SummarizeColumns avec GroupBy uniquement | OK | OK | OK |
SummarizeColumns avec des filtres/mesures | OK | ERROR | ERROR |
À partir de juin 2024, nous activons les SummarizeColumns contextuels qui permettent à SummarizeColumns d’être évalués dans n’importe quelle transition de contexte, SummarizeColumns dans la mesure est désormais entièrement pris en charge :
SummarizeColumns Type | Filtre externe avec une seule colonne | Filtre externe avec plusieurs colonnes | Colonnes GroupBy externes |
---|---|---|---|
SummarizeColumns avec GroupBy uniquement | OK | OK | OK |
SummarizeColumns avec des filtres/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 filtres externes
Nous introduisons un concept sémantique nommé SelfValue, qui modifie la façon dont les filtres des tables externes interagissent avec les colonnes GroupBy dans SummarizeColumns. Cette modification interdit aux filtres d’une autre table d’affecter les colonnes GroupBy, même si les tables sont associées via une relation de filtre par rapport. 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, le filtre TreatAs s’applique à l’opération GroupBy dans SummarizeColumns, en tirant parti de la relation entre « Product » [Product Key] et « 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, les colonnes GroupBy dans SummarizeColumns ne seront plus filtrées par colonnes à partir de tables externes, même si une relation existe entre elles. Par conséquent, dans l’exemple ci-dessus, la colonne GroupBy « Reseller Sales » [ProductKey] ne sera pas filtrée par la colonne « Product » [ProductKey]. Par conséquent, la requête inclut des lignes où « Reseller Sales » [ProductKey] n’est pas égal à 229.
Si vous préférez conserver le comportement précédent, 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 GroupBy n’est pas 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, si toutes les colonnes GroupBy d’une table spécifique étaient entièrement couvertes par un filtre Treatas unique 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 filtre Treatas, qu’elles soient valides ou non. Par exemple, le résultat serait une table à une seule ligne (« États-Unis », « Alberta »), même si aucune ligne n’est associée à [Country] = « États-Unis » et [State] = « Alberta » existait dans la table « Geography ».
Ce problème a été connu et a été résolu par la mise à jour. Après la mise à jour, ces lignes non valides sont filtrées et 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 aux valeurs [Pays] et [État] spécifiées dans la table « Geography ».
Interdire les keepfilters mixtes/substitution de filtres sur la même table/cluster
La mise à jour récente a introduit une restriction temporaire qui déclenche un message d’erreur 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 erreur se produit lorsque les filtres normaux (qui remplacent les filtres existants) et les filtres avec KeepFilters spécifiés 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 filtres sur la table « Geography » : un avec KeepFilters spécifiés et un sans. Ces filtres se chevauchent avec des filtres externes sur différentes colonnes. Actuellement, cette configuration n’est pas autorisée, car en interne, les deux filtres sont regroupés en un seul et le système ne peut pas déterminer le comportement de substitution de filtre correct pour le filtre en 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. Si vous rencontrez cette erreur, nous vous conseillons d’ajuster les filtres dans SummarizeColumns en ajoutant ou en supprimant KeepFilters si nécessaire pour garantir un comportement de substitution cohérent sur chaque table.