Gruppi di calcolo

Si applica a: SQL Server 2019 e versioni successive di Analysis Services Azure Analysis Services Fabric/Power BI Premium

I gruppi di calcolo possono ridurre significativamente il numero di misure ridondanti raggruppando le espressioni di misura comuni come elementi di calcolo. I gruppi di calcolo sono supportati nei modelli tabulari a livello di compatibilità 1500 e superiore.

Vantaggi

I gruppi di calcolo affrontano un problema nei modelli complessi in cui può verificarsi una proliferazione di misure ridondanti usando gli stessi calcoli, più comuni con i calcoli di Business Intelligence per le gerarchie temporali. Ad esempio, un analista delle vendite vuole visualizzare i totali delle vendite e gli ordini per data mensile (MTD), trimestre a data (QTD), anno a data (YTD), ordini da anno a data per l'anno precedente (PY) e così via. Il modello di dati deve creare misure separate per ogni calcolo, che può portare a decine di misure. Per l'utente, ciò può significare dover ordinare tutte le misure e applicarle singolarmente al report.

Si esamini prima di tutto il modo in cui i gruppi di calcolo vengono visualizzati agli utenti in uno strumento di creazione di report come Power BI. Verranno quindi esaminati gli elementi che costituiscono un gruppo di calcolo e il modo in cui vengono creati in un modello.

I gruppi di calcolo vengono visualizzati nei client di creazione report sotto forma di tabella con una singola colonna. La colonna non è simile a una colonna o una dimensione tipica, ma rappresenta uno o più calcoli riutilizzabili o elementi di calcolo che possono essere applicati a qualsiasi misura già aggiunta al filtro Valori per una visualizzazione.

Nell'animazione seguente un utente analizza i dati sulle vendite per anni 2012 e 2013. Prima di applicare un gruppo di calcolo, la misura di base comune Sales calcola una somma delle vendite totali per ogni mese. L'utente vuole quindi applicare calcoli di Business Intelligence per le gerarchie temporali per ottenere i totali delle vendite per la data, il trimestre, l'anno fino alla data e così via. Senza gruppi di calcolo, l'utente dovrà selezionare singole misure di Business Intelligence per le gerarchie temporali.

Con un gruppo di calcolo, in questo esempio denominato Time Intelligence, quando l'utente trascina l'elemento Calcolo ora nell'area filtro Colonne , ogni elemento di calcolo viene visualizzato come colonna separata. I valori per ogni riga vengono calcolati dalla misura di base Sales.

Gruppo di calcolo applicato in Power BI

I gruppi di calcolo funzionano con misure DAX esplicite . In questo esempio Sales è una misura esplicita già creata nel modello. I gruppi di calcolo non funzionano con misure DAX implicite. Ad esempio, in Power BI le misure implicite vengono create quando un utente trascina le colonne negli oggetti visivi per visualizzare i valori aggregati, senza creare una misura esplicita. Al momento, Power BI genera DAX per misure implicite scritte come calcoli DAX inline, vale a dire che le misure implicite non possono funzionare con i gruppi di calcolo. È stata introdotta una nuova proprietà del modello visibile nel modello a oggetti tabulari (TOM), DiscourageImplicitMeasures. Attualmente, per creare gruppi di calcolo questa proprietà deve essere impostata su true. Se impostato su true, Power BI Desktop in modalità Live Connect disabilita la creazione di misure implicite.

I gruppi di calcolo supportano anche query MDX (Multidimensional Data Expressions). Ciò significa che gli utenti di Microsoft Excel, che eseguono query su modelli di dati tabulari tramite MDX, possono sfruttare appieno i gruppi di calcolo nelle tabelle pivot e nei grafici del foglio di lavoro.

Come funzionano

Ora che si è visto come i gruppi di calcolo traggono vantaggio dagli utenti, si esamini come viene creato l'esempio di gruppo di calcolo di Business Intelligence per le gerarchie temporali.

Prima di esaminare i dettagli, verranno introdotte alcune nuove funzioni DAX specifiche per i gruppi di calcolo:

SELECTEDMEASURE : usato dalle espressioni per gli elementi di calcolo per fare riferimento alla misura attualmente nel contesto. In questo esempio la misura Sales.

SELECTEDMEASURENAME : usato dalle espressioni per gli elementi di calcolo per determinare la misura in base al contesto in base al nome.

ISSELECTEDMEASURE : usato dalle espressioni per gli elementi di calcolo per determinare la misura nel contesto specificata in un elenco di misure.

SELECTEDMEASUREFORMATSTRING : utilizzato dalle espressioni per gli elementi di calcolo per recuperare la stringa di formato della misura nel contesto.

Esempio di Business Intelligence per le gerarchie temporali

Nome tabella - Business Intelligence per le gerarchie temporali
Nome colonna - Calcolo tempo
Precedenza - 20

Elementi di calcolo di Business Intelligence per le gerarchie temporali

Corrente

SELECTEDMEASURE()

MTD

CALCULATE(SELECTEDMEASURE(), DATESMTD(DimDate[Date]))

QTD

CALCULATE(SELECTEDMEASURE(), DATESQTD(DimDate[Date]))

YTD

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

PY

CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(DimDate[Date]))

PY MTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "MTD"
)

PY QTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "QTD"
)

PY YTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

YOY

SELECTEDMEASURE() -
CALCULATE(
    SELECTEDMEASURE(),
    'Time Intelligence'[Time Calculation] = "PY"
)

YOY%

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

Per testare questo gruppo di calcolo, eseguire una query DAX in SSMS o in DAX Studio open source. Nota: YOY e YOY% vengono omessi da questo esempio di query.

Query di Business Intelligence per le gerarchie temporali

EVALUATE
CALCULATETABLE (
    SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Current", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "Current" ),
        "QTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "QTD" ),
        "YTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "YTD" ),
        "PY",      CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY" ),
        "PY QTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY QTD" ),
        "PY YTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY YTD" )
    ),
    DimDate[CalendarYear] IN { 2012, 2013 }
)

Restituzione di query di Business Intelligence per le gerarchie temporali

La tabella restituita mostra i calcoli per ogni elemento di calcolo applicato. Ad esempio, vedere QTD per marzo 2012 è la somma di gennaio, febbraio e marzo 2012.

Restituzione di query di Business Intelligence per le gerarchie temporali

Stringhe di formato dinamico

Le stringhe di formato dinamico con i gruppi di calcolo consentono l'applicazione condizionale delle stringhe di formato alle misure senza forzarle a restituire stringhe.

I modelli tabulari supportano la formattazione dinamica delle misure usando la funzione FORMAT di DAX. Tuttavia, la funzione FORMAT presenta lo svantaggio di restituire una stringa, forzando le misure che altrimenti sarebbero numeriche da restituire anche come stringa. Questo può presentare alcune limitazioni, ad esempio non funziona con la maggior parte degli oggetti visivi di Power BI a seconda dei valori numerici, ad esempio i grafici.

In Power BI le stringhe di formato dinamico per le misure consentono anche l'applicazione condizionale di stringhe di formato a una misura specifica senza forzarle a restituire una stringa e senza l'uso di gruppi di calcolo. Per altre informazioni, vedere Stringhe di formato dinamico per le misure.

Stringhe di formato dinamico per l'intelligenza temporale

Se si esamina l'esempio di Business Intelligence per le gerarchie temporali illustrato in precedenza, tutti gli elementi di calcolo ad eccezione di YOY% devono usare il formato della misura corrente nel contesto. Ad esempio, YTD calcolato sulla misura di base Sales deve essere valuta. Se si trattasse di un gruppo di calcolo per una misura di base Orders, il formato sarà numerico. YOY%, tuttavia, deve essere una percentuale indipendentemente dal formato della misura di base.

Per YOY%, è possibile eseguire l'override della stringa di formato impostando la proprietà dell'espressione stringa di formato su 0,00%;-0,00%; 0,00%. Per altre informazioni sulle proprietà dell'espressione stringa di formato, vedere MdX Cell Properties - FORMAT STRING Contents.To learn more about format string expression properties, see MDX Cell Properties - FORMAT STRING Contents.

In questo oggetto visivo matrice in Power BI si noterà che Sales Current/YOY e Orders Current/YOY mantengono le rispettive stringhe di formato di misura di base. Sales YOY% e Orders YOY%, tuttavia, esegue l'override della stringa di formato per usare il formato percentuale .

Intelligenza temporale nell'oggetto visivo matrice

Stringhe di formato dinamico per la conversione di valuta

Le stringhe di formato dinamico offrono una semplice conversione di valuta. Si consideri il modello di dati Adventure Works seguente. Viene modellato per la conversione di valuta uno-a-molti , come definito dai tipi di conversione.

Tasso di valuta nel modello tabulare

Una colonna FormatString viene aggiunta alla tabella DimCurrency e popolata con stringhe di formato per le rispettive valute.

Formattare la colonna stringa

Per questo esempio, il gruppo di calcolo seguente viene quindi definito come:

Esempio di conversione valuta

Nome tabella - Conversione valuta
Nome colonna - Calcolo conversione
Precedenza - 5

Elementi di calcolo per la conversione valuta

Nessuna conversione

SELECTEDMEASURE()

Valuta convertita

IF(
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE( DimCurrency[CurrencyName], "US Dollar" ) = "US Dollar",
    SELECTEDMEASURE(),
    SUMX(
        VALUES(DimDate[Date]),
        CALCULATE( DIVIDE( SELECTEDMEASURE(), MAX(FactCurrencyRate[EndOfDayRate]) ) )
    )
)

Espressione stringa di formato

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

Nota

Le espressioni di selezione per i gruppi di calcolo sono attualmente in anteprima e possono essere usate per implementare la conversione automatica della valuta nei gruppi di calcolo, eliminando la necessità di avere due elementi di calcolo distinti.

L'espressione stringa di formato deve restituire una stringa scalare. Usa la nuova funzione SELECTEDMEASUREFORMATSTRING per ripristinare la stringa di formato della misura di base se sono presenti più valute nel contesto di filtro.

L'animazione seguente mostra la conversione dinamica della valuta in formato della misura Sales in un report.

Stringa di formato dinamico di conversione valuta applicata

Espressioni di selezione (anteprima)

Le espressioni di selezione sono proprietà facoltative definite per un gruppo di calcolo. Esistono due tipi di espressioni di selezione:

  • multipleOrEmptySelectionExpression. Questa espressione di selezione viene applicata quando sono stati selezionati più elementi di calcolo, è stato selezionato un elemento di calcolo non esistente o quando è stata effettuata una selezione in conflitto.
  • noSelectionExpression. Questa espressione di selezione viene applicata quando il gruppo di calcolo non viene filtrato.

Entrambe queste espressioni di selezione hanno anche un'espressione stringa di formato dinamico formatStringDefinition.

In sintesi, in un gruppo di calcolo è possibile definire quanto segue:

...
"calculationGroup": {
  "multipleOrEmptySelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  },
  "noSelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  }
...
}

Nota

Queste espressioni, se specificate, vengono applicate solo per le situazioni specifiche indicate. Le selezioni per un singolo elemento di calcolo non sono interessate da queste espressioni.

Ecco una panoramica di queste espressioni e del relativo comportamento predefinito, se non specificato:

Tipo di selezione Espressione di selezione non definita (impostazione predefinita) Espressione di selezione definita
Selezione singola La selezione viene applicata La selezione viene applicata
Selezione multipla Il gruppo di calcolo non è filtrato Risultato restituito della valutazione di multipleOrEmptySelectionExpression
Selezione vuota Il gruppo di calcolo non è filtrato Risultato restituito della valutazione di multipleOrEmptySelectionExpression
Nessuna selezione Il gruppo di calcolo non è filtrato Risultato restituito della valutazione di noSelectionExpression

Selezione multipla o vuota

Se vengono effettuate più selezioni nello stesso gruppo di calcolo, il gruppo di calcolo valuterà e restituirà il risultato di multipleOrEmptySelectionExpression, se definito. Se questa espressione non è stata definita, il gruppo di calcolo restituirà il risultato seguente:

SELECTEDMEASURE()

Si esamini ad esempio un gruppo di calcolo denominato MyCalcGroup con multipleOrEmptySelectionExpression configurato come segue:

IF (
ISFILTERED ( 'MyCalcGroup' ),
    "Filters: " 
         & CONCATENATEX ( 
  	            FILTERS ( 'MyCalcGroup'[Name] ),
            'MyCalcGroup'[Name], 
            ", "
     	   )
)

Si supponga ora di eseguire la selezione seguente nel gruppo di calcolo:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item1" || 'MyCalcGroup'[Name] = "item2"
    )
}

In questo caso vengono selezionati due elementi nel gruppo di calcolo, "item1" e "item2". Si tratta di una selezione multipla e quindi viene valutato multipleOrEmptySelectionExpression e restituisce il risultato seguente : "Filters: item1, item2".

Successivamente, eseguire la selezione seguente nel gruppo di calcolo:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item4" -- item4 does not exists
    )
}

Questo è un esempio di selezione vuota, perché "item4" non esiste in questo gruppo di calcolo. Di conseguenza, multipleOrEmptySelectionExpression viene valutato e restituisce il risultato seguente : "Filters: ".

Nessuna selezione

Se il gruppo di calcolo non è stato filtrato, verrà applicato noSelectionExpression in un gruppo di calcolo. Viene usato principalmente per eseguire azioni predefinite senza la necessità che l'utente esegua un'azione, pur fornendo flessibilità all'utente per eseguire l'override dell'azione predefinita. Si esamini ad esempio la conversione automatica della valuta con il dollaro usa come valuta pivot centrale.

È possibile configurare un gruppo di calcolo con il comando noSelectionExpression seguente:

IF (
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE (
        DimCurrency[CurrencyName],
        "US Dollar"
    ) = "US Dollar",
    SELECTEDMEASURE (),
    SUMX (
        VALUES ( DimDate[DateKey] ),
        CALCULATE (
            DIVIDE ( SELECTEDMEASURE (), MAX ( FactCurrencyRate[EndOfDayRate] ) )
        )
    )
)

Verrà inoltre impostato un formatStringDefinition per questa espressione:

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

Ora, se non viene selezionata alcuna valuta, tutte le valute verranno convertite automaticamente nella valuta pivot (dollaro USA) in base alle esigenze. Oltre a ciò, è comunque possibile selezionare un'altra valuta per convertire in tale valuta senza dover cambiare gli elementi di calcolo come si dovrebbe fare senza noSelectionExpression.

Precedenza

La precedenza è una proprietà definita per un gruppo di calcolo. Specifica l'ordine in cui i gruppi di calcolo vengono combinati con la misura sottostante quando si usa SELECTEDMEASURE() nell'elemento di calcolo.

Esempio di precedenza

Si osservi l'esempio seguente. Questo modello ha una misura con un valore specificato pari a 10 e due gruppi di calcolo, ognuno con un singolo elemento di calcolo. Verranno applicati entrambi gli elementi di calcolo del gruppo di calcolo alla misura. Questo è il modo in cui è stato configurato:

'Measure group'[Measure] = 10

Il primo gruppo di calcolo è 'Calc Group 1 (Precedence 100)' e l'elemento di calcolo è 'Calc item (Plus 2)':

'Calc Group 1 (Precedence 100)'[Calc item (Plus 2)] = SELECTEDMEASURE() + 2

Il secondo gruppo di calcolo è 'Calc Group 2 (Precedence 200)' e l'elemento di calcolo è 'Calc item (Times 2)':

'Calc Group 2 (Precedence 200)'[Calc item (Times 2)] = SELECTEDMEASURE() * 2

È possibile vedere il gruppo di calcolo 1 ha un valore di precedenza pari a 100 e il gruppo di calcolo 2 ha un valore di precedenza pari a 200.

Usando SQL Server Management Studio (SSMS) o uno strumento esterno con funzionalità di lettura/scrittura XMLA, ad esempio il Editor tabulare open source, è possibile usare script XMLA per creare gruppi di calcolo e impostare i valori di precedenza. Qui aggiungiamo "Calc group 1 (Precedence 100)":

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 1 (Precedence 100)"
    },
    "table": {
      "name": "Calc group 1 (Precedence 100)",
      "calculationGroup": {
        "precedence": 100,
        "calculationItems": [
          {
            "name": "Calc item (Plus 2)",
            "expression": "SELECTEDMEASURE() + 2",
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 1 (Precedence 100)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

E questo script aggiunge "Calc group 2 (Precedence 200)":

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 2 (Precedence 200)"
    },
    "table": {
      "name": "Calc group 2 (Precedence 200)",
      "calculationGroup": {
        "precedence": 200,
        "calculationItems": [
          {
            "name": "Calc item (Times 2)",
            "expression": "SELECTEDMEASURE() * 2"
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 2 (Precedence 200)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

In Power BI Desktop è disponibile un oggetto visivo scheda che mostra la misura e un filtro dei dati per ognuno dei gruppi di calcolo nella visualizzazione report:

Espressioni separate del gruppo di misure.

Quando vengono selezionati entrambi i filtri dei dati, è necessario combinare le espressioni DAX. A tale scopo, si inizia con l'elemento di calcolo con precedenza più alta, 200 e quindi si sostituisce l'argomento SELECTEDMEASURE() con il successivo valore più alto, 100.

Di conseguenza, l'espressione DAX dell'elemento di calcolo con precedenza più elevata è:

SELECTEDMEASURE() * 2 

E il secondo elemento di calcolo con precedenza più alta espressione DAX è:

SELECTEDMEASURE() + 2 

Ora vengono combinati sostituendo la parte SELECTEDMEASURE() dell'elemento di calcolo con precedenza più alta con l'elemento di calcolo con la precedenza più alta successiva, come illustrato di seguito:

( SELECTEDMEASURE() + 2 ) * 2

Quindi, se sono presenti più elementi di calcolo, si continua fino a raggiungere la misura sottostante. In questo modello sono presenti solo due gruppi di calcolo, quindi ora si sostituisce SELECTEDMEASURE() con la misura stessa, come illustrato di seguito:

( ( [Measure] ) + 2 ) * 2

Measure = 10Come , è uguale a:

( ( 10 ) + 2 ) * 2

Quando non sono presenti altri argomenti SELECTEDMEASURE(), viene valutata l'espressione DAX combinata:

( ( 10 ) + 2 ) * 2 = 24

In Power BI Desktop, quando entrambi i gruppi di calcolo vengono applicati con un filtro dei dati, l'output della misura è simile al seguente:

Espressioni combinate del gruppo di misure.

Tenere tuttavia presente che la combinazione è annidata in modo che l'output non sia 10 + 2 * 2 = 14 come illustrato di seguito:

Espressioni nidificate del gruppo di misure.

Per le trasformazioni semplici, la valutazione è dalla precedenza inferiore a quella più alta. Ad esempio, 10 ha aggiunto 2, quindi viene moltiplicato per 2. In DAX sono disponibili funzioni come CALCULATE che applicano filtri o modifiche di contesto alle espressioni interne. In questo caso, la precedenza più alta modifica un'espressione di precedenza inferiore.

La precedenza determina anche quale stringa di formato dinamico viene applicata all'espressione DAX combinata per ogni misura. La stringa di formato dinamico del gruppo di calcolo con precedenza più elevata è l'unica applicata. Se una misura stessa ha una stringa di formato dinamico, viene considerata una precedenza inferiore a qualsiasi gruppo di calcolo nel modello.

Esempio di precedenza con medie

Si esamini ora un altro esempio usando lo stesso modello illustrato nell'esempio di Business Intelligence per le gerarchie temporali descritto in precedenza in questo articolo. Ma questa volta si aggiungerà anche un gruppo di calcolo Averages . Il gruppo di calcolo Medie contiene calcoli medi indipendenti dall'intelligenza temporale tradizionale in quanto non modificano il contesto di filtro data, ma applicano solo calcoli medi al suo interno.

In questo esempio viene definito un calcolo medio giornaliero. I calcoli come i barili medi di petrolio al giorno sono comuni nelle applicazioni petrolifere e gas. Altri esempi di business comuni includono la media delle vendite dei negozi al dettaglio.

Anche se tali calcoli vengono calcolati indipendentemente dai calcoli di Business Intelligence per le gerarchie temporali, potrebbe essere necessario combinarli. Ad esempio, un utente potrebbe voler visualizzare barili di petrolio al giorno YTD per visualizzare il tasso di petrolio giornaliero dall'inizio dell'anno alla data corrente. In questo scenario, la precedenza deve essere impostata per gli elementi di calcolo.

I nostri presupposti sono:

Il nome della tabella è Averages.
Il nome della colonna è Calcolo medio.
La precedenza è 10.

Elementi di calcolo per medie

Nessuna media

SELECTEDMEASURE()

Media giornaliera

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Di seguito è riportato un esempio di query DAX e di una tabella restituita:

Query media

EVALUATE
    CALCULATETABLE (
        SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Sales", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "No Average"
        ),
        "YTD", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "No Average"
        ),
        "Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "Daily Average"
        ),
        "YTD Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "Daily Average"
        )
    ),
    DimDate[CalendarYear] = 2012
)

Restituzione della query Averages

Restituzione della query Averages

Nella tabella seguente viene illustrato come vengono calcolati i valori di marzo 2012.

Nome colonna Calcolo
YTD Somma delle vendite per jan, feb, mar 2012
= 495.364 + 506.994 + 373.483
Media giornaliera Vendite per mar 2012 diviso per numero di giorni nel mese di marzo
= 373.483 / 31
Media giornaliera YTD YTD per mar 2012 diviso per numero di giorni in gennaio, febbraio e mar
= 1.375.841 / (31 + 29 + 31)

Ecco la definizione dell'elemento di calcolo YTD, applicato con precedenza pari a 20.

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

Ecco la media giornaliera, applicata con precedenza pari a 10.

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Poiché la precedenza del gruppo di calcolo di Business Intelligence per le gerarchie temporali è superiore a quella del gruppo di calcolo Averages, viene applicata il più ampio possibile. Il calcolo YTD Daily Average applica YTD sia al numeratore che al denominatore (conteggio dei giorni) del calcolo medio giornaliero.

Equivale all'espressione seguente:

CALCULATE(DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate)), DATESYTD(DimDate[Date]))

Non questa espressione:

DIVIDE(CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date])), COUNTROWS(DimDate)))

Ricorsione laterale

Nell'esempio di Business Intelligence per le gerarchie temporali precedente, alcuni degli elementi di calcolo fanno riferimento ad altri nello stesso gruppo di calcolo. Questa operazione è denominata ricorsione laterale. Ad esempio, YOY% fa riferimento sia a YOY che a PY.

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

In questo caso, entrambe le espressioni vengono valutate separatamente perché usano istruzioni di calcolo diverse. Altri tipi di ricorsione non sono supportati.

Singolo elemento di calcolo nel contesto di filtro

Nell'esempio di Business Intelligence per le gerarchie temporali l'elemento di calcolo PY YTD ha una singola espressione di calcolo:

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

L'argomento YTD della funzione CALCULATE() esegue l'override del contesto di filtro per riutilizzare la logica già definita nell'elemento di calcolo YTD. Non è possibile applicare sia PY che YTD in una singola valutazione. I gruppi di calcolo vengono applicati solo se un singolo elemento di calcolo del gruppo di calcolo è nel contesto di filtro.

Ordering

Per impostazione predefinita, quando una colonna di un gruppo di calcolo viene inserita in un report, gli elementi di calcolo vengono ordinati alfabeticamente in base al nome. L'ordine in cui gli elementi di calcolo vengono visualizzati in un report può essere modificato specificando la proprietà Ordinal. La specifica dell'ordine degli articoli di calcolo con la proprietà Ordinal non modifica la precedenza, l'ordine in cui vengono valutati gli elementi di calcolo. Non modifica inoltre l'ordine in cui gli elementi di calcolo vengono visualizzati in Esplora modelli tabulari.

Per specificare la proprietà ordinale per gli elementi di calcolo, è necessario aggiungere una seconda colonna al gruppo di calcolo. A differenza della colonna predefinita in cui Tipo di dati è Text, una seconda colonna utilizzata per l'ordinamento degli elementi di calcolo ha un tipo di dati Numero intero. L'unico scopo di questa colonna è specificare l'ordine numerico in cui vengono visualizzati gli elementi di calcolo nel gruppo di calcolo. Poiché questa colonna non fornisce alcun valore in un report, è consigliabile impostare la proprietà Hidden su True.

Colonna per l'ordinamento

Dopo l'aggiunta di una seconda colonna al gruppo di calcolo, è possibile specificare il valore della proprietà Ordinale per gli elementi di calcolo da ordinare.

Proprietà Ordinal

Per altre informazioni, vedere Per ordinare gli elementi di calcolo.

Creare un gruppo di calcolo

I gruppi di calcolo sono supportati in Visual Studio con Visual Studio Projects VSIX update 2.9.2 e versioni successive. È anche possibile creare gruppi di calcolo usando TMSL (Tabular Model Scripting Language) o il open source Editor tabulare.

Per creare un gruppo di calcolo tramite Visual Studio

  1. In Esplora modelli tabulari fare clic con il pulsante destro del mouse su Gruppi di calcolo, quindi scegliere Nuovo gruppo di calcolo. Per impostazione predefinita, un nuovo gruppo di calcolo ha una singola colonna e un singolo elemento di calcolo.

  2. Usare Proprietà per modificare il nome e immettere una descrizione per il gruppo di calcolo, la colonna e l'elemento di calcolo predefinito.

  3. Per immettere un'espressione di formula DAX per l'elemento di calcolo predefinito, fare clic con il pulsante destro del mouse e quindi scegliere Modifica formula per aprire il Editor DAX. Immettere un'espressione valida.

  4. Per aggiungere altri elementi di calcolo, fare clic con il pulsante destro del mouse su Elementi di calcolo, quindi scegliere Nuovo elemento di calcolo.

Per ordinare gli elementi di calcolo

  1. In Esplora modelli tabulari fare clic con il pulsante destro del mouse su un gruppo di calcolo e quindi scegliere Aggiungi colonna.

  2. Assegnare alla colonna il nome Ordinale (o qualcosa di simile), immettere una descrizione e quindi impostare la proprietà Hidden su True.

  3. Per ogni elemento di calcolo che si desidera ordinare, impostare la proprietà Ordinal su un numero positivo. Ogni numero è sequenziale, ad esempio, viene visualizzato un elemento di calcolo con una proprietà Ordinale pari a 1, viene visualizzata una proprietà pari a 2 secondi e così via. Gli elementi di calcolo con il valore predefinito -1 non sono inclusi nell'ordinamento, ma vengono visualizzati prima degli elementi ordinati in un report.

Limitazioni

La sicurezza a livello di oggetto definita nelle tabelle dei gruppi di calcolo non è supportata. Tuttavia, OLS può essere definito in altre tabelle nello stesso modello. Se un elemento di calcolo fa riferimento a un oggetto protetto OLS, viene restituito un errore generico.

La sicurezza a livello di riga non è supportata. Definire la sicurezza a livello di riga nelle tabelle nello stesso modello, ma non sui gruppi di calcolo stessi (direttamente o indirettamente).

Le espressioni di righe di dettaglio non sono supportate con i gruppi di calcolo.

Narrazione intelligente oggetti visivi in Power BI non sono supportati con i gruppi di calcolo.

Le aggregazioni di colonne implicite in Power BI non sono supportate per i modelli con gruppi di calcolo. Attualmente, se la proprietà DiscourageImplicitMeasures è impostata su false (impostazione predefinita), vengono visualizzate le opzioni di aggregazione, ma non possono essere applicate. Se DiscourageImplicitMeasures è impostato su true, le opzioni di aggregazione non vengono visualizzate.

Quando si creano report di Power BI tramite LiveConnection, le stringhe di formato dinamico non vengono applicate alle misure a livello di report.

Vedi anche

DAX nei modelli tabulari
Informazioni di riferimento su DAX