Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 in modelli complessi in cui può verificarsi una proliferazione di misure superflue che utilizzano gli stessi calcoli, ed è più comune con i calcoli di intelligenza temporale. Ad esempio, un analista delle vendite vuole visualizzare i totali delle vendite e gli ordini per mese corrente (MTD), trimestre corrente (QTD), anno corrente (YTD), ordini dell'anno in corso 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 esaminerà 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. Si esaminerà quindi cosa costituisce un gruppo di calcolo e come vengono creati in un modello.
I gruppi di calcolo vengono visualizzati nei client di report come 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 sta analizzando i dati di vendita per gli 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 intelligenza temporale per ottenere i totali delle vendite mese fino ad oggi, trimestre fino ad oggi, anno fino ad oggi e così via. Senza gruppi di calcolo, l'utente avrebbe dovuto selezionare singole misure di intelligenza temporale.
Con un gruppo di calcolo, in questo esempio denominato Time Intelligence, quando l'utente trascina l'elemento Calcolo temporale nell'area filtro Colonne, ogni elemento di calcolo viene visualizzato come una colonna separata. I valori per ogni riga vengono calcolati dalla misura di base Sales.
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, ovvero le misure implicite non possono funzionare con i gruppi di calcolo. È stata introdotta una nuova proprietà del modello visibile nel modello a oggetti tabulare (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 hai visto come i gruppi di calcolo apportano benefici agli utenti, esaminiamo come viene creato l'esempio di gruppo di calcolo di Intelligenza Temporale.
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 in contesto. In questo esempio, la misura delle vendite.
SELECTEDMEASURENAME - usato dalle espressioni per gli elementi di calcolo per identificare la misura che si trova nel 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 Time Intelligence
Nome tabella - Intelligenza Temporale
Nome colonna - Calcolo ora
Precedenza - 20
Elementi di calcolo di Intelligenza Temporale
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 la query DAX seguente. Nota: MTD, YOY e YOY% vengono omessi da questo esempio di query.
Query di Time Intelligence
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 Time Intelligence
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.
Stringhe di formato dinamico
Le stringhe di formato dinamico con gruppi di calcolo consentono l'applicazione condizionale di 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ò avere 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 Intelligenza Temporale mostrato sopra, tutti gli elementi di calcolo tranne YOY% devono usare il formato della misura corrente nel contesto. Ad esempio, YTD calcolato sulla misura di base delle vendite dovrebbe essere espresso in valuta. Se si trattasse di un gruppo di calcolo per una misura base degli ordini, il formato sarebbe 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.
In questa visualizzazione matrice in Power BI si vede Sales Current/YOY e Orders Current/YOY mantengono le rispettive stringhe di formato delle misure di base. Sales YOY% e Orders YOY%, tuttavia, esegue l'override della stringa di formato per usare il formato percentuale .
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. È modellato per la conversione di valuta uno-a-molti come definito dai tipi di conversione.
Una colonna FormatString viene aggiunta alla tabella DimCurrency e popolata con stringhe di formato per le rispettive valute.
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()
)
Annotazioni
Le espressioni di selezione per i gruppi di calcolo possono essere usate per implementare la conversione automatica della valuta nei gruppi di calcolo, eliminando la necessità di disporre di 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 illustra come la misura Sales viene convertita dinamicamente nel formato valuta in un report.
Espressioni di selezione
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 oppure
- è stata effettuata una selezione conflittuale.
- noSelectionExpression. Questa espressione di selezione viene applicata quando il gruppo di calcolo non viene filtrato.
Entrambe queste espressioni di selezione hanno anche un'espressione di stringa di formato dinamico formatStringDefinition.
In sintesi, in un gruppo di calcolo è possibile definire quanto segue, ad esempio usando TMDL:
...
table Scenarios
calculationGroup
...
multipleOrEmptySelectionExpression = <expression>
formatStringDefinition = <format string>
noSelectionExpression= <expression>
formatStringDefinition = <format string>
...
Annotazioni
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 | Restituisce il risultato della valutazione di multipleOrEmptySelectionExpression |
Selezione vuota | Il gruppo di calcolo non è filtrato | Restituisce il risultato della valutazione di multipleOrEmptySelectionExpression |
Nessuna selezione | Il gruppo di calcolo non è filtrato | Risultato restituito della valutazione di noSelectionExpression |
Annotazioni
Usare l'impostazione selectionExpressionBehavior del modello per influenzare ulteriormente il risultato restituito da un gruppo di calcolo quando le espressioni di selezione non vengono definite.
Impostazione del modello SelectionExpressionBehavior
I modelli hanno un'impostazione selectionExpressionBehavior che consente di controllare ulteriormente il comportamento dei gruppi di calcolo in tale modello. Questa impostazione accetta i tre valori seguenti:
- Automatica. Si tratta del valore predefinito e corrisponde a quello nonvisuale. In questo modo si garantisce che i modelli esistenti non modifichino il comportamento. I modelli che superano un livello di compatibilità futuro impostato su automatico utilizzeranno visual invece. In quel momento sarà presente un annuncio.
-
Nonvisual. Se il gruppo di calcolo non definisce un'espressione multipleOrEmptySelection , il gruppo di calcolo restituisce
SELECTEDMEASURE()
e quando si raggruppa in base al gruppo di calcolo, i valori subtotali sono nascosti. -
Visuale. Se il gruppo di calcolo non definisce un'espressione multipleOrEmptySelection , il gruppo di calcolo restituisce
BLANK()
. Quando si raggruppa in base al gruppo di calcolo, i valori subtotali vengono determinati valutando la misura selezionata nel contesto del gruppo di calcolo.
Usare TMDL per impostare la proprietà sul tuo modello:
createOrReplace
model Model
...
selectionExpressionBehavior: <automatic|nonvisual|visual>
...
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 se l'impostazione selectionExpressionBehavior del modello è impostata su automatico o nonvisual:
SELECTEDMEASURE()
Se l'impostazione selectionExpressionBehavior del modello è impostata a visuale, il gruppo di calcolo restituirà:
BLANK()
Di seguito viene illustrato 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 valutata la multipleOrEmptySelectionExpression e restituisce il risultato seguente: "Filters: item1, item2".
Eseguire quindi 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. Pertanto, 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. Questa operazione viene usata principalmente per eseguire azioni predefinite senza la necessità dell'utente di intervenire pur fornendo flessibilità all'utente per eseguire l'override dell'azione predefinita. Ad esempio, esaminiamo la conversione automatica delle valute con il dollaro USA come valuta pivot centrale.
È possibile configurare un gruppo di calcolo con il valore 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 è selezionata alcuna valuta, tutte le valute verranno convertite automaticamente nella valuta pivot (dollaro statunitense) in base alle esigenze. In cima a questo, è comunque possibile scegliere un'altra valuta da convertire in tale valuta senza dover cambiare gli elementi di calcolo come sarebbe necessario 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
Di seguito viene illustrato un semplice esempio. 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 , come l'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"
}
}
]
}
}
}
Nella visualizzazione report di Power BI Desktop, abbiamo una visualizzazione della scheda che mostra la misura e un selezionatore per ognuno dei gruppi di calcolo.
Quando entrambi i slicer sono selezionati, dobbiamo combinare le espressioni DAX. A tale scopo, iniziamo con l'elemento di calcolo con precedenza più alta, 200 e quindi sostituiamo l'argomento SELECTEDMEASURE() con il successivo massimo, 100.
Pertanto, l'espressione DAX dell'elemento di calcolo con precedenza più alta è:
SELECTEDMEASURE() * 2
E la seconda espressione DAX dell'elemento di calcolo con precedenza più alta è:
SELECTEDMEASURE() + 2
Ora vengono combinati sostituendo la parte SELECTEDMEASURE() dell'elemento di calcolo della 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, continuiamo 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
Come Measure = 10, questo è lo stesso di:
( ( 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 uno slicer, il risultato della misura è simile al seguente:
Tenere tuttavia presente che la combinazione è annidata in modo che l'output non sia 10 + 2 * 2 = 14 come illustrato di seguito:
Per le trasformazioni semplici, la valutazione è dalla precedenza inferiore a quella superiore. Ad esempio, 10 ha aggiunto 2, quindi viene moltiplicato per 2. In DAX esistono funzioni come CALCULATE che applicano filtri o modifiche di contesto alle espressioni interne. In questo caso, la precedenza superiore 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ù alta è l'unica applicata. Se una misura ha una stringa di formato dinamico, viene considerata una precedenza inferiore a qualsiasi gruppo di calcolo nel modello.
Esempio di precedenza con media
Verrà ora esaminato 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, aggiungiamo 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 delle date, 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 aziendali comuni includono la media delle vendite al dettaglio.
Anche se tali calcoli vengono effettuati indipendentemente dai calcoli di intelligenza temporale, 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
Nessun calcolo della media
SELECTEDMEASURE()
Media giornaliera
DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))
Di seguito è riportato un esempio di query DAX e di una tabella restituita:
Query delle medie
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
)
Valore medio restituito dalla query
Nella tabella seguente viene illustrato come vengono calcolati i valori di marzo 2012.
Nome della colonna | Calcolo |
---|---|
Da inizio anno | 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 una precedenza pari a 10.
DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))
Poiché la precedenza del gruppo di calcolo di Time Intelligence è superiore a quella del gruppo di calcolo Medie, viene applicato il più ampiamente 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 Time Intelligence sopra, alcuni degli elementi di calcolo fanno riferimento ad altri nello stesso gruppo di calcolo. Questa operazione viene chiamata 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 Intelligenza Temporale, l'elemento di calcolo PY YTD presenta 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.
Ordinando
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. Se si specifica l'ordine degli elementi di calcolo con la proprietà Ordinal non viene modificata la precedenza, l'ordine in cui vengono valutati gli elementi di calcolo. Non modifica anche 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 ordinare gli 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.
Dopo l'aggiunta di una seconda colonna al gruppo di calcolo, è possibile specificare il valore della proprietà Ordinal per gli elementi di calcolo da ordinare.
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 l'editor tabulare open source.
Per creare un gruppo di calcolo usando Visual Studio
In Esplora modelli tabulari fare clic con il pulsante destro del mouse su Gruppi di calcolo e quindi scegliere Nuovo gruppo di calcolo. Per impostazione predefinita, un nuovo gruppo di calcolo ha una singola colonna e un singolo elemento di calcolo.
Usare Proprietà per modificare il nome e immettere una descrizione per il gruppo di calcolo, la colonna e l'elemento di calcolo predefinito.
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 l'editor DAX. Immettere un'espressione valida.
Per aggiungere altri elementi di calcolo, fare clic con il pulsante destro del mouse su Elementi di calcolo e quindi scegliere Nuovo elemento di calcolo.
Per ordinare gli elementi di calcolo
In Esplora modelli tabulari fare clic con il pulsante destro del mouse su un gruppo di calcolo e quindi scegliere Aggiungi colonna.
Assegnare alla colonna il nome Ordinale (o qualcosa di simile), immettere una descrizione e quindi impostare la proprietà Hidden su True.
Per ogni elemento di calcolo da ordinare, impostare la proprietà Ordinal su un numero positivo. Ogni numero è sequenziale, ad esempio, un elemento di calcolo con una proprietà Ordinale pari a 1 viene visualizzato per primo, viene visualizzata una proprietà pari a 2 secondi e così via. Gli elementi di calcolo con il -1 predefinito non sono inclusi nell'ordinamento, ma vengono visualizzati prima degli elementi ordinati in un report.
Considerazioni
Non appena un gruppo di calcolo viene aggiunto a un modello semantico, i report di Power BI useranno il tipo di dati variant per tutte le misure. Se successivamente, tutti i gruppi di calcolo vengono rimossi dal modello, le misure verranno nuovamente restituite ai relativi tipi di dati originali.
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 RLS (sicurezza a livello di riga) sulle 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.
I visual narrativi intelligenti 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), le opzioni di aggregazione vengono visualizzate, 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.