Condividi tramite


SUMMARIZECOLUMNS

Si applica a:colonna calcolatatabella calcolataMeasurecalcolo visivo

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 la quale i values distinti sono inclusi nella tabella restituita. Ogni colonna groupBy_columnName viene unita in join incrociato (tabelle diverse) or esiste automaticamente (stessa tabella) con le colonne specificate successive.
filterTable Espressione di tabella aggiunta al contesto filter delle colonne all specificate come argomenti groupBy_columnName. La values presente nella tabella filter viene usata per filter prima dell'esecuzione di cross-join/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 value (not una tabella).

Restituisce value

Tabella che include combinazioni di values dalle colonne fornite in base al raggruppamento specificato. Nella tabella restituita vengono incluse solo le righe per le quali almeno una delle espressioni fornite restituisce unblankvalue non. If all espressioni evaluate a BLANK/NULL per una riga, tale riga viene not inclusa nella tabella restituita.

Osservazioni:

  • Questa funzione not garantisce qualsiasi 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 è not supportata per l'uso in modalità DirectQuery quando viene usata nelle colonne calcolate or regole di sicurezza a livello di riga.

contesto di Filter

Si consideri la query seguente:

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

In questa query, senza un measure le colonne groupBynot contengono colonne dell'espressione FILTER, ad esempio dalla tabella Customer. Il filter viene not applicato alle colonne di groupBy. Le tabelle Sales Territory and Customer possono essere indirettamente related tramite la tabella Reseller sales fact. Poiché sono not direttamente related, l'espressione filter è un no-op and le colonne groupBy sono not 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 filterand che filter viene applicata ai risultati 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 all espressioni not utilizzando IGNORE restituire BLANK/NULL verranno escluse indipendentemente dal fatto che le espressioni che usano IGNOREevaluate per BLANK/NULL ornot. IGNORE può essere usato solo all'interno di un'espressione SUMMARIZECOLUMNS.

Esempio

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

Verrà eseguito il rollup della colonna Sales[CustomerId], creando un subtotale per all 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

All'espressione ignorata,

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

Even anche se entrambe le espressioni restituiscono blank per alcune righe, vengono incluse poiché non sono presenti espressioni non allineate che restituiscono blank.

Customerid Blank BlankIfTotalQtyIsNot5
A 5
B
C

Con NONVISUAL

La funzione NONVISUAL contrassegna un valuefilter nella funzione SUMMARIZECOLUMNS come not che influisce su measurevalues, ma si applica solo alle colonne groupBy. NONVISUAL può essere usato 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 tra all 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 funzione di 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 di ROLLUPADDISSUBTOTAL modifica il comportamento della funzione SUMMARIZECOLUMNS aggiungendo rolluprighe /subtotali al risultato in base alle colonne groupBy_columnName. ROLLUPADDISSUBTOTAL può essere usato 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
True True 60398
Accessori False True 36092
Accessori Bike Racks False False 328
Bikes Mountain Bikes False False 4970
Clothing False True 9101

Esempio con più subtotali

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

Le vendite sono raggruppate per stato, per cliente, per date, con subtotali per 1. Vendite per stato, per date 2. Vendite per stato, per cliente 3. Rollup su entrambi i anddate cliente che portano alle vendite in base allo stato.

Restituisce la tabella seguente:

IDCliente IsCustomerSubtotal Provincia Quantità totale Date IsDateSubtotal
A FALSE WA 5 10/7/2014
B FALSE WA 1 10/7/2014
B FALSE WA 2 7/11/2014
C FALSE OR 2 10/7/2014
C 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
C FALSE OR 3 TRUE
TRUE WA 8 TRUE
TRUE OR 3 TRUE

Con ROLLUPGROUP

Analogamente alla funzione SUMMARIZE, è possibile usare ROLLUPGROUP insieme a ROLLUPADDISSUBTOTAL per specificare quali gruppi di riepilogo/granularità (subtotali) includere, riducendo il numero di righe subtotali restituite. ROLLUPGROUP può essere usato solo all'interno di un'espressione SUMMARIZECOLUMNSorSUMMARIZE.

Esempio con più subtotali

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

Ancora raggruppati per City and State, ma distribuiti insieme quando si segnala un subtotale restituisce 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
OR C FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Milano FALSE
OR TRUE 3 Portland FALSE
A FALSE 5 FALSE
B FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

SummarizeColumns contestuali

Background

Fino a febbraio 2023, SUMMARIZECOLUMNS ha not supportato la valutazione all'interno di una transizione di contesto in all. Nei prodotti rilasciati prima di tale month, questa limitazione ha reso utile SUMMARIZECOLUMNSnot nella maggior parte delle misure: è stato not possibile chiamare un measureSUMMARIZECOLUMNS in qualsiasi caso di transizione del contesto, incluso altri SUMMARIZECOLUMNSstatements.

A partire da febbraio 2023, la transizione del contesto è stata supportata in alcuni scenari, ma not in all le condizioni. I casi supportati and con restrizioni sono i seguenti:

tipo SummarizeColumns Filter esterna con una singola colonna Filter esterna con più colonne Colonne GroupBy esterne
SummarizeColumns solo con GroupBy OK OK OK
SummarizeColumns con Filters/Measures OK ERROR ERROR

A partire da giugno 2024, l'SummarizeColumns contestuale consente di valutare SummarizeColumns in qualsiasi transizione di contesto, SummarizeColumns in measure è now completamente supportato:

tipo SummarizeColumns Filter esterna con una singola colonna Filter esterna con più colonne Colonne GroupBy esterne
SummarizeColumns solo con GroupBy OK OK OK
SummarizeColumns con Filters/Measures 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 filters esterni

Viene introdotto un concetto semantico denominato SelfValue, che modifica il modo in cui filters da tabelle esterne interagiscono con le colonne GroupBy in SummarizeColumns. Questa modifica non consente filters da una tabella diversa per influire sulle colonne GroupBy, evenif le tabelle vengono related tramite una relazione filter-by. 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 TreatAsfilter si applica all'operazione di GroupBy all'interno di SummarizeColumns, sfruttando la relazione tra "Product"[Product Key] and "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, GroupBy colonne all'interno di SummarizeColumns non verranno più filtrate in base a colonne da tabelle esterne, evenif esiste una relazione tra di esse. Nell'esempio precedente, pertanto, la colonna GroupBy 'Reseller Sales'[ProductKey] not essere filtrata in base alla colonna 'Product'[ProductKey]. Di conseguenza, la query includerà righe in cui 'Reseller Sales'[ProductKey] è not uguale a 229.

If si preferisce mantenere il comportamento di previous, è 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 è not interessata dalla restrizione SelfValue introdotta dall'aggiornamento.

Convalida delle righe per groupby colonne completamente coperte da Treatas

Prima di questo aggiornamento, all'interno di una funzione SummarizeColumns, ifallGroupBy colonne di una tabella specifica erano completamente coperte da una singola Treatasfilter 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 nella Treatasfilter, indipendentemente dal fatto che siano valide ornot. Ad esempio, il risultato sarebbe una tabella a riga singola ("Stati Uniti", "Alberta"), evenif nessuna riga di questo tipo con [Country] = "Stati Uniti" and [State] = "Alberta" esiste nella tabella 'Geography'.

Questo problema è stato noto and è stato risolto dall'aggiornamento. Dopo l'aggiornamento, tali righe non valide verranno filtrate, and verranno restituite solo le righe valide della tabella GroupBy. Di conseguenza, il risultato della query precedente sarebbe vuoto, perché nella tabella 'Geography' non sono presenti righe valide corrispondenti al [Country] specificato and [State] values.

Non consentire Keepfiltersmisti /overriddefilters nella stessa tabella/cluster

L'aggiornamento recente ha introdotto una restrizione temporanea che attiva un messaggio di error 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 error si verifica quando entrambe le filters normali (che eseguono l'override di filtersesistenti ) andfilters con KeepFilters specificate 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 presenti due filters nella tabella 'Geography': una con KeepFilters specificata and senza. Queste filters si sovrappongono a filters esterne su colonne diverse. Attualmente, questa configurazione è not consentita perché internamente, le due filters vengono raggruppate in una, and il sistema non è in grado di determinare il comportamento di override corretto filter per l'filter cluster in questi casi.

Si noti che questa restrizione è temporanea. Stiamo sviluppando attivamente soluzioni per rimuovere questa limitazione negli aggiornamenti futuri. If questo error, è consigliabile modificare il filters all'interno di SummarizeColumns aggiungendo or rimuovendo KeepFilters in base alle esigenze per garantire un comportamento di override coerente in ogni tabella.

SUMMARIZE