Manipolazione dei dati MDX - Informazioni sull'ordine di passaggio e sull'ordine di risoluzione

Si applica a: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

L'operazione di calcolo di un cubo, risultante da uno script MDX, può essere suddivisa in numerose fasi di calcolo a seconda dell'utilizzo delle varie funzionalità correlate ai calcoli. Ognuna di queste fasi viene indicata come sessione di calcolo.

Per fare riferimento a una sessione di calcolo è possibile specificare una posizione ordinale, denominata numero della sessione di calcolo. Il numero di sessioni di calcolo necessario per elaborare completamente tutte le celle di un cubo è noto come livello di nidificazione della sessione di calcolo del cubo.

I dati writeback e delle tabelle dei fatti influiscono solo sulla sessione 0. Gli script popolano i dati dopo la sessione 0. Per ogni istruzione di assegnazione e calcolo in uno script viene creata una nuova sessione di calcolo. Esternamente allo script MDX, i riferimenti alla sessione assoluta 0 si riferiscono all'ultima sessione creata dallo script per il cubo.

In tutte le sessioni vengono creati membri calcolati, ma l'espressione viene applicata alla sessione corrente. Le sessioni precedenti contengono la misura calcolata, ma con un valore Null.

Ordine di valutazione

L'ordine di valutazione determina la priorità di calcolo in presenza di espressioni in conflitto. Nell'ambito di una singola sessione, l'ordine di valutazione determina quanto segue:

  • Ordine in cui Microsoft SQL Server SQL Server Analysis Services valuta dimensioni, membri, membri calcolati, rollup personalizzati e celle calcolate.

  • Ordine in cui SQL Server Analysis Services calcola membri personalizzati, membri calcolati, rollup personalizzato e celle calcolate.

Viene data la precedenza al membro con l'ordine di valutazione più alto.

Nota

L'unica eccezione è rappresentata dalla funzione di aggregazione. Per i membri calcolati con la funzione di aggregazione viene applicato un ordine di valutazione inferiore rispetto a qualsiasi misura calcolata intersecante.

Valori dell'ordine di valutazione e precedenze

I valori dell'ordine di valutazione sono compresi tra -8181 e 65535. In questo intervallo, alcuni valori dell'ordine di valutazione corrispondono a tipi specifici di calcoli, come illustrato nella tabella seguente.

Calcolo Ordine di valutazione
Formule personalizzate membro -5119
Operatori unari -5119
Calcolo di totali visualizzati -4096
Tutti gli altri calcoli (se non diversamente specificato) 0

È consigliabile utilizzare esclusivamente numeri interi positivi per l'impostazione dei valori dell'ordine di valutazione. Se si assegnano valori inferiori a quelli indicati nella tabella precedente, il risultato della sessione di calcolo può diventare imprevedibile. Se, ad esempio, al calcolo per un membro calcolato viene assegnato un valore dell'ordine di valutazione inferiore al valore predefinito delle formule di rollup personalizzato, che corrisponde a -5119, tale valore comporta l'esecuzione del calcolo dei membri calcolati prima delle formule di rollup personalizzato e può produrre risultati non corretti.

Creazione e modifica dell'ordine di valutazione

Nel riquadro Calcolidi Progettazione cubi è possibile modificare l'ordine di valutazione per i membri calcolati e le celle calcolate modificando l'ordine dei calcoli.

In MDX è possibile usare la parola chiave SOLVE_ORDER per creare o modificare l'ordine di valutazione per membri calcolati e celle calcolate.

Esempi di ordine di valutazione

Per illustrare le potenziali complessità correlate all'ordine di valutazione, la serie seguente di query MDX inizia con due query che singolarmente non presentano problemi a livello di ordine di valutazione. Queste due query vengono quindi combinate in una singola query, che richiede l'applicazione dell'ordine di valutazione.

Query 1-Differences in Income and Expenses

Per la prima query MDX, calcolare la differenza tra vendite e costi per ogni anno costruendo una semplice query MDX simile all'esempio seguente:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] )  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

In questa query è presente un solo membro calcolato, cioè Year Difference. Essendo presente un solo membro calcolato, l'ordine di valutazione è irrilevante, a condizione che nel cubo non vengano utilizzati membri calcolati.

Questa query MDX genera un set di risultati simile a quello illustrato nella tabella seguente.

Importo vendite Internet Internet Total Product Cost
CY 2007 $9,791,060.30 $5,718,327.17
CY 2008 $9,770,899.74 $5,721,205.24
Year Difference ($20,160.56) $2,878.06

Query 2-Percentage of Income after Expenses

Per la seconda query, calcolare la percentuale di reddito al netto delle spese per ogni anno utilizzando la query MDX seguente:

WITH   
MEMBER  
[Measures].[Profit Margin] AS   
([Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent"  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008] }  
ON ROWS  
FROM [Adventure Works]  

In questa query MDX, come nella precedente, è presente un solo membro calcolato, Profit Margin, e pertanto non presenta complicazioni relativamente all'ordine di valutazione.

Questa query MDX genera un set di risultati leggermente diverso, simile a quello illustrato nella tabella seguente.

Importo vendite Internet Internet Total Product Cost Profit Margin
CY 2007 $9,791,060.30 $5,718,327.17 41.60%
CY 2008 $9,770,899.74 $5,721,205.24 41.45%

Le differenze nei set di risultati della prima e della seconda query sono dovute alla diversa posizione del membro calcolato. Nella prima query il membro calcolato fa parte dell'asse ROWS e non dell'asse COLUMNS indicato nella seconda query. Questa differenza di posizione diventa importante nella query successiva, in cui i due membri calcolati vengono combinati in una singola query MDX.

Eseguire query sulla differenza di 3 anni combinati e sui calcoli del reddito netto

Nella query finale, in cui vengono combinati entrambi gli esempi precedenti in una singola query MDX, l'ordine di valutazione diventa importante a causa dei calcoli in entrambe le colonne e le righe. Per assicurarsi che i calcoli vengano eseguiti nella sequenza corretta, definire la sequenza di esecuzione dei calcoli tramite la parola chiave SOLVE_ORDER .

La parola chiave SOLVE_ORDER consente di specificare l'ordine di valutazione dei membri calcolati in una query MDX o in un comando CREATE MEMBER . I valori integer utilizzati con la parola chiave SOLVE_ORDER sono relativi e non devono necessariamente iniziare da zero o essere consecutivi. Il valore indica semplicemente al sistema MDX di calcolare un membro in base ai valori derivati dal calcolo dei membri con un valore superiore. Se un membro calcolato viene definito senza la parola chiave SOLVE_ORDER , il relativo valore predefinito sarà zero.

Se ad esempio si combinano i calcoli utilizzati nelle prime due query di esempio, i due membri calcolati Year Difference e Profit Marginsi intersecano in corrispondenza di una singola cella nel set di dati risultante dell'esempio di query MDX. L'unico modo per determinare come SQL Server Analysis Services valuterà questa cella è in base all'ordine di risoluzione. Le formule utilizzate per creare la cella genereranno risultati diversi a seconda dell'ordine di valutazione dei due membri calcolati.

Provare innanzitutto a combinare nella query MDX seguente i calcoli utilizzati nelle prime due query:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 1  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 2  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

In questo esempio di query MDX combinata, a Profit Margin è associato l'ordine di valutazione più alto, pertanto ha la precedenza quando le due espressioni interagiscono. SQL Server Analysis Services valuta la cella in questione usando la Profit Margin formula . Nella tabella seguente sono riportati i risultati di questo calcolo nidificato.

Importo vendite Internet Internet Total Product Cost Profit Margin
CY 2007 $9,791,060.30 $5,718,327.17 41.60%
CY 2008 $9,770,899.74 $5,721,205.24 41.45%
Year Difference ($20,160.56) $2,878.06 114.28%

Il risultato nella cella condivisa è basato sulla formula per Profit Margin. Ovvero, SQL Server Analysis Services calcola il risultato nella cella condivisa con i Year Difference dati, generando la formula seguente (il risultato viene arrotondato per maggiore chiarezza):

((9,770,899.74 - 9,791,060.30) - (5,721,205.24 - 5,718,327.17)) / (9,770,899.74 - 9,791,060.30) = 1.14275744   

oppure

(23,038.63) / (20,160.56) = 114.28%  

È chiaramente errata. Tuttavia, SQL Server Analysis Services calcola il risultato nella cella condivisa in modo diverso se si cambiano gli ordini di risoluzione per i membri calcolati nella query MDX. Nella query MDX combinata seguente viene invertito l'ordine di valutazione dei membri calcolati:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 2  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 1  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

Quando l'ordine dei membri calcolati è stato modificato, SQL Server Analysis Services usa la Year Difference formula per valutare la cella, come illustrato nella tabella seguente.

Importo vendite Internet Internet Total Product Cost Profit Margin
CY 2007 $9,791,060.30 $5,718,327.17 41.60%
CY 2008 $9,770,899.74 $5,721,205.24 41.45%
Year Difference ($20,160.56) $2,878.06 (0.15%)

Poiché nella query viene usata la formula Year Difference con i dati Profit Margin , la formula per la cella condivisa assomiglia al calcolo seguente:

(($9,770,899.74 - 5,721,205.24) / $9,770,899.74) - ((9,791,060.30 - 5,718,327.17) / 9,791,060.30) = -0.15   

Oppure

0.4145 - 0.4160= -0.15  

Ulteriori considerazioni

L'ordine di valutazione può essere un aspetto estremamente complesso da affrontare, soprattutto in cubi con un numero elevato di dimensioni che includono membri calcolati, formule di rollup personalizzato o celle calcolate. Quando SQL Server Analysis Services valuta una query MDX, SQL Server Analysis Services tiene conto dei valori dell'ordine di risoluzione per tutti gli elementi coinvolti in un determinato passaggio, incluse le dimensioni del cubo specificato nella query MDX.

Vedere anche

CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
Istruzione CREATE MEMBER (MDX)
Manipolazione dei dati (MDX)