SUMMARIZECOLUMNS
Si applica a: Calcolo visivo misura tabella calcolata colonna calcolata
Restituisce una tabella di riepilogo su un set di gruppi.
Sintassi
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
Parametri
Termine | Definizione |
---|---|
groupBy_columnName | Riferimento di colonna completo (Table[Column]) a una tabella di base per cui i valori distinti sono inclusi nella tabella restituita. Ogni colonna groupBy_columnName viene unita con un cross join (tabelle diverse) o viene sottoposta ad Auto Exist (stessa tabella) con le colonne successive specificate. |
filterTable | Espressione di tabella che viene aggiunta al contesto di filtro di tutte le colonne specificate come argomenti groupBy_columnName. I valori presenti nella tabella di filtro vengono usati per filtrare prima dell'esecuzione di un cross join o di Auto Exist. |
name | Stringa che rappresenta il nome della colonna da usare per l'espressione successiva specificata. |
expression | Qualsiasi espressione DAX che restituisce un singolo valore (non una tabella). |
Valore restituito
Tabella che include combinazioni di valori dalle colonne specificate, in base al raggruppamento specificato. Nella tabella restituita vengono incluse solo le righe per le quali almeno una delle espressioni specificate restituisce un valore non vuoto. Se tutte le espressioni restituiscono BLANK/NULL per una riga, tale riga non verrà inclusa nella tabella restituita.
Osservazioni:
Questa funzione non garantisce alcun ordinamento per i risultati.
Una colonna non può essere specificata più di una volta nel parametro groupBy_columnName. La formula seguente, ad esempio, non è valida.
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
Questa funzione non è supportata per l'uso nella modalità DirectQuery se usata in colonne calcolate o nelle regole di sicurezza a livello di riga.
Contesto di filtro
Si consideri la query seguente:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
In questa query senza una misura le colonne groupBy non contengono colonne dell'espressione FILTER (ad esempio, della tabella Customer). Il filtro non viene applicato alle colonne groupBy. Le tabelle Sales Territory e Customer possono essere indirettamente correlate tramite la tabella dei fatti Reseller sales. Poiché non sono correlate direttamente, l'espressione filtro non prevede alcuna operazione e le colonne groupBy non sono interessate.
Tuttavia con questa query:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
Le colonne groupBy contengono una colonna interessata dal filtro e tale filtro viene applicato ai risultati di groupBy.
Con IGNORE
La sintassi IGNORE può essere usata per modificare il comportamento della funzione SUMMARIZECOLUMNS omettendo espressioni specifiche dalla valutazione BLANK/NULL. Le righe per le quali tutte le espressioni che non usano IGNORE restituiscono BLANK/NULL verranno escluse, indipendentemente dal fatto che le espressioni che usano IGNORE restituiscano o meno BLANK/NULL. La funzione IGNORE può essere usata solo all'interno di un'espressione SUMMARIZECOLUMNS.
Esempio
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
Esegue il rollup della colonna Sales[CustomerId], creando un subtotale per tutti i clienti nel raggruppamento specificato. Senza IGNORE, il risultato è:
Customerid | Quantità totale | BlankIfTotalQtyIsNot3 |
---|---|---|
A | 5 | |
B | 3 | 3 |
C | 3 | 3 |
Con IGNORE,
Customerid | Quantità totale | BlankIfTotalQtyIsNot3 |
---|---|---|
B | 3 | 3 |
C | 3 | 3 |
Tutte le espressioni ignorate,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Anche se entrambe le espressioni restituiscono BLANK per alcune righe, vengono incluse perché non sono presenti espressioni non ignorate che restituiscono BLANK.
Customerid | Spazio vuoto | BlankIfTotalQtyIsNot5 |
---|---|---|
Un | 5 | |
B | ||
A |
Con NONVISUAL
La funzione NONVISUAL indica che un filtro di valore nella funzione SUMMARIZECOLUMNS non influisce sui valori di misura, ma si applica solo alle colonne groupBy. La funzione NONVISUAL può essere usata solo all'interno di un'espressione SUMMARIZECOLUMNS.
Esempio
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]
Restituisce il risultato in cui [Visual Total Sales] è il totale per tutti gli anni:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9,791,060.30 | 29,358,677.22 |
2008 | 9,770,899.74 | 29,358,677.22 |
Al contrario, la stessa query senza la funzione 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]
Restituisce il risultato in cui [Visual Total Sales] è il totale per i due anni selezionati:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9,791,060.30 | 19,561,960.04 |
2008 | 9,770,899.74 | 19,561,960.04 |
Con ROLLUPADDISSUBTOTAL
L'aggiunta della sintassi ROLLUPADDISSUBTOTAL modifica il comportamento della funzione SUMMARIZECOLUMNS aggiungendo righe di rollup/subtotali al risultato in base alle colonne groupBy_columnName. La funzione ROLLUPADDISSUBTOTAL può essere usata solo all'interno di un'espressione SUMMARIZECOLUMNS.
Esempio con singolo subtotale
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]
Restituisce la tabella seguente:
Categoria | Sottocategoria | IsCategorySubtotal | IsSubcategorySubtotal | Quantità totale |
---|---|---|---|---|
Vero | Vero | 60398 | ||
Accessori | False | Vero | 36092 | |
Accessori | Bike Racks | False | False | 328 |
Bikes | Mountain Bikes | False | False | 4970 |
Clothing | False | Vero | 9101 |
Esempio con più subtotali
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
Le vendite vengono raggruppate per stato, per cliente, per data, con subtotali per 1. Vendite per stato, per data 2. Vendite per stato, per cliente 3. Il rollup viene eseguito sia per cliente che per data, ottenendo le vendite per stato.
Restituisce la tabella seguente:
IDCliente | IsCustomerSubtotal | Provincia | Quantità totale | Data | IsDateSubtotal |
---|---|---|---|---|---|
A | FALSE | WA | 5 | 10/7/2014 | |
B | FALSE | WA | 1 | 10/7/2014 | |
B | FALSE | WA | 2 | 7/11/2014 | |
A | FALSE | OPPURE | 2 | 10/7/2014 | |
A | FALSE | OPPURE | 1 | 7/11/2014 | |
TRUE | WA | 6 | 10/7/2014 | ||
TRUE | WA | 2 | 7/11/2014 | ||
TRUE | OPPURE | 2 | 10/7/2014 | ||
TRUE | OPPURE | 1 | 7/11/2014 | ||
A | FALSE | WA | 5 | TRUE | |
B | FALSE | WA | 3 | TRUE | |
A | FALSE | OPPURE | 3 | TRUE | |
TRUE | WA | 8 | TRUE | ||
TRUE | OPPURE | 3 | TRUE |
Con ROLLUPGROUP
Analogamente alla funzione SUMMARIZE, è possibile usare ROLLUPGROUP con ROLLUPADDISSUBTOTAL per specificare quali gruppi di riepilogo/granularità (subtotali) includere (riducendo il numero di righe di subtotale restituite). La funzione ROLLUPGROUP può essere usata solo all'interno di un'espressione SUMMARIZECOLUMNS o SUMMARIZE.
Esempio con più subtotali
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
Ancora raggruppati per città e stato, ma sommati insieme quando si indica un subtotale, viene restituita la tabella seguente.
Provincia | Customerid | IsCustomerSubtotal | Quantità totale | City | IsCityStateSubtotal |
---|---|---|---|---|---|
WA | A | FALSE | 2 | Bellevue | FALSE |
WA | B | FALSE | 2 | Bellevue | FALSE |
WA | A | FALSE | 3 | Milano | FALSE |
WA | B | FALSE | 1 | Milano | FALSE |
OPPURE | A | FALSE | 3 | Portland | FALSE |
WA | TRUE | 4 | Bellevue | FALSE | |
WA | TRUE | 4 | Milano | FALSE | |
OPPURE | TRUE | 3 | Portland | FALSE | |
A | FALSE | 5 | FALSE | ||
B | FALSE | 3 | TRUE | ||
A | FALSE | 3 | TRUE | ||
TRUE | 11 | TRUE |
Riepilogo contestualeColumns
Background
Fino a febbraio 2023, SUMMARIZECOLUMNS non supportava affatto la valutazione all'interno di una transizione di contesto. Nei prodotti rilasciati prima di quel mese, questa limitazione ha reso SUMMARIZECOLUMNS non utile nella maggior parte delle misure. Non è stato possibile chiamare una misura SUMMARIZECOLUMNS in alcun caso di transizione del contesto, incluse altre istruzioni SUMMARIZECOLUMNS.
A partire da febbraio 2023, la transizione del contesto è stata supportata in alcuni scenari, ma non in tutte le condizioni. I casi supportati e limitati sono i seguenti:
Tipo SummarizeColumns | Filtro esterno con colonna singola | Filtro esterno con più colonne | Colonne GroupBy esterne |
---|---|---|---|
SummarizeColumns solo con GroupBy | Ok | Ok | Ok |
SummarizeColumns con filtri/misure | Ok | ERROR | ERROR |
A partire da giugno 2024, è possibile abilitare SummarizeColumns contestuale che consente di valutare SummarizeColumns in qualsiasi transizione di contesto, SummarizeColumns nella misura è ora completamente supportato:
Tipo SummarizeColumns | Filtro esterno con colonna singola | Filtro esterno con più colonne | Colonne GroupBy esterne |
---|---|---|---|
SummarizeColumns solo con GroupBy | Ok | Ok | Ok |
SummarizeColumns con filtri/misure | Ok | Ok | Ok |
Tuttavia, questo aggiornamento include anche modifiche al comportamento di SummarizeColumns, che può modificare i risultati delle espressioni esistenti:
Semantica SelfValue per i filtri esterni
Viene introdotto un concetto semantico denominato SelfValue, che modifica il modo in cui i filtri delle tabelle esterne interagiscono con le colonne GroupBy in SummarizeColumns. Questa modifica impedisce i filtri di una tabella diversa per influire sulle colonne GroupBy, anche se le tabelle sono correlate tramite una relazione di filtro per. Un esempio che illustra l'impatto di questa modifica comporta l'espressione seguente:
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Prima di questo aggiornamento, il filtro TreatAs verrà applicato all'operazione GroupBy all'interno di SummarizeColumns, sfruttando la relazione tra 'Product'[Product Key] e 'Reseller Sales'[ProductKey]. Di conseguenza, i risultati della query includono solo le righe in cui 'Reseller Sales'[ProductKey] è uguale a 229. Tuttavia, dopo l'aggiornamento, le colonne GroupBy all'interno di SummarizeColumns non verranno più filtrate in base alle colonne da tabelle esterne, anche se esiste una relazione tra di esse. Pertanto, nell'esempio precedente la colonna GroupBy 'Reseller Sales'[ProductKey] non verrà filtrata in base alla colonna 'Product'[ProductKey]. Di conseguenza, la query includerà righe in cui 'Reseller Sales'[ProductKey] non è uguale a 229.
Se si preferisce mantenere il comportamento precedente, è possibile riscrivere l'espressione usando Summarize anziché SummarizeColumns, come illustrato di seguito:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Questa espressione riscritta mantiene la semantica originale in cui l'operazione GroupBy non è influenzata dalla restrizione SelfValue introdotta dall'aggiornamento.
Convalida delle righe per le colonne groupby completamente coperte da Treatas
Prima di questo aggiornamento, all'interno di una funzione SummarizeColumns, se tutte le colonne GroupBy di una tabella specifica erano completamente coperte da un singolo filtro Treatas dalla stessa tabella, come illustrato di seguito:
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
Il risultato della query precedente include le righe specificate nel filtro Treatas, indipendentemente dal fatto che siano valide o meno. Ad esempio, il risultato sarebbe una tabella a riga singola ("Stati Uniti", "Alberta"), anche se tale riga con [Country] = "Stati Uniti" e [State] = "Alberta" esisteva nella tabella 'Geography'.
Questo problema è stato noto ed è stato risolto dall'aggiornamento. Dopo l'aggiornamento, tali righe non valide verranno filtrate e verranno restituite solo le righe valide della tabella GroupBy. Di conseguenza, il risultato della query precedente sarebbe vuoto, poiché non sono presenti righe valide corrispondenti ai valori [Country] e [State] specificati nella tabella 'Geography'.
Non consentire filtri Keepfilters/overriddefilter misti nello stesso cluster o tabella
L'aggiornamento recente ha introdotto una restrizione temporanea che attiva un messaggio di errore che indica:
"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."
Questo errore si verifica quando entrambi i filtri normali (che eseguono l'override dei filtri esistenti) e i filtri con KeepFilter specificati sono presenti all'interno della stessa tabella/cluster. Ad esempio:
Evaluate CalculateTable(
SummarizeColumns(
Product[Color],
KeepFilters(
TreatAs(
{( "Washington")}
, Geography[State]
)
),
TreatAs(
{("United States"), ("Canada")}
, Geography[Country]
)
)
,TreatAs({("Alberta")}, Geography[State])
,TreatAs({("Canada")}, Geography[Country])
)
Nell'espressione precedente sono disponibili due filtri per la tabella 'Geography': uno con KeepFilters specificato e uno senza. Questi filtri si sovrappongono a filtri esterni su colonne diverse. Attualmente, questa configurazione non è consentita perché internamente, i due filtri vengono raggruppati in uno e il sistema non è in grado di determinare il comportamento di override corretto del filtro per il filtro cluster in questi casi.
Si noti che questa restrizione è temporanea. Stiamo sviluppando attivamente soluzioni per rimuovere questa limitazione negli aggiornamenti futuri. Se si verifica questo errore, è consigliabile modificare i filtri all'interno di SummarizeColumns aggiungendo o rimuovendo KeepFilters in base alle esigenze per garantire un comportamento di override coerente in ogni tabella.