Compartir a través de


Descripción de orden de paso y orden de resolución (MDX)

Cuando un cubo se calcula como el resultado de un script de MDX, puede atravesar varias fases de computación según el uso de varias características relativas al cálculo. Cada una de estas fases se denomina paso de cálculo.

Se puede hacer referencia a un paso de cálculo con una posición ordinal, llamada número de paso de cálculo. El recuento de los pasos de cálculo necesarios para calcular por completo todas las celdas de un cubo se denomina profundidad de paso de cálculo del cubo.

Los datos de la tabla de hechos y reescritura solo afectan al paso 0. Los scripts rellenan los datos después del paso 0; cada instrucción de asignación y cálculo de un script crea un nuevo paso. Fuera del script MDX, las referencias al paso absoluto 0 hacen referencia al último paso creado por el script del cubo.

Los miembros calculados se crean en todos los pasos, pero la expresión se aplica al paso actual. Los pasos anteriores contienen la medida calculada, pero con un valor NULL.

Orden de resolución

El orden de resolución determina la prioridad de cálculo en el caso de expresiones enfrentadas. En un solo paso, el orden de resolución determina dos cosas:

  • El orden en el que Microsoft SQL Server Analysis Services evalúa dimensiones, miembros, miembros calculados, resúmenes personalizados y celdas calculadas.

  • El orden en el que Analysis Services calcula miembros personalizados, miembros calculados, resúmenes personalizados y celdas calculadas.

Tendrá prioridad el miembro con el orden de resolución superior.

[!NOTA]

La excepción a esta prioridad es la función Agregado. Los miembros calculados con la función Agregado tienen un orden de resolución inferior al de las medidas calculadas coincidentes.

Valores y prioridad de orden de resolución

Los valores de orden de resolución varían de -8181 a 65535. En este intervalo, algunos valores de orden de resolución corresponden a tipos específicos de cálculos, como se muestra en la siguiente tabla.

Cálculo

Orden de resolución

Fórmulas de miembro personalizado

-5119

Operadores unarios

-5119

Cálculo de totales visuales

-4096

Resto de cálculos (si no se especifica lo contrario)

0

Se recomienda utilizar enteros positivos para establecer valores de orden de resolución. Si asigna valores posteriores a los valores de orden de resolución mostrados en la tabla anterior, el paso de cálculo puede resultar imprevisible. Por ejemplo, el cálculo de un miembro calculado recibe un valor de orden de resolución que es menor que el valor de la fórmula de resumen personalizado predeterminado de -5119. Dicho valor de orden de resolución bajo produce los miembros calculados que se van a calcular antes de las fórmulas de resumen personalizadas y puede generar resultados incorrectos.

Crear y cambiar el orden de resolución

En el Diseñador de cubos, en el panel Cálculos, puede cambiar el orden de resolución de miembros calculados y celdas calculadas si cambia el orden de los cálculos.

En MDX, puede utilizar la palabra clave SOLVE_ORDER para crear o cambiar miembros calculados y celdas calculadas.

Ejemplos de orden de resolución

Para ilustrar las posibles complejidades del orden de resolución, la siguiente serie de consultas MDX comienza con dos consultas que no presentan individualmente problemas de orden de resolución. Estas dos consultas se combinan en una consulta que requiere un orden de resolución.

[!NOTA]

Puede ejecutar estas consultas MDX con la base de datos multidimensional de ejemplo de Adventure Works. Puede descargar el ejemplo de modelos multidimensionales AdventureWorks SQL Server 2012 del sitio de codeplex.

Consulta 1—Diferencias de Income y Expenses

En la primera consulta MDX, calcule la diferencia de ventas y costos de cada año creando una consulta MDX simple similar al siguiente ejemplo:

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]

En esta consulta, solo existe un miembro calculado: Year Difference. Dado que solo existe un miembro calculado, el orden de resolución no supone un problema mientras el cubo no utilice miembros calculados.

Esta consulta MDX ofrece un conjunto de resultados similar a la siguiente tabla.

Internet Sales Amount

Costo total del producto por Internet

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

Consulta 2: porcentaje de ingresos después de gastos

En la segunda consulta, calcule el porcentaje de ingresos después de gastos para cada año con la siguiente consulta MDX:

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]

En esta consulta MDX, al igual que en la anterior, solo existe un miembro calculado, Profit Margin, por lo que no se producen complicaciones por el orden de resolución.

Esta consulta MDX ofrece un conjunto de resultados similar a la siguiente tabla.

Internet Sales Amount

Costo total del producto por Internet

Margen de beneficio

CY 2007

$9,791,060.30

$5,718,327.17

41.60%

CY 2008

$9,770,899.74

$5,721,205.24

41.45%

La diferencia de los conjuntos de resultados entre la primera y la segunda consulta radica en la distinta colocación del miembro calculado. En la primera consulta, el miembro calculado se encuentra en el eje ROWS, mientras que en la segunda consulta se encuentra en el eje COLUMNS. Esta distinta colocación adquiere importancia en la siguiente consulta, en la que se combinan dos miembros calculados en una única consulta MDX.

Consulta 3—Cálculos combinados de Year Difference y Net Income

En esta consulta final que combina los dos ejemplos previos en una sola consulta MDX, el orden de resolución es importante debido a los cálculos de ambas columnas y filas. Para asegurarse de que los cálculos se realizan en la secuencia correcta, defina la secuencia en la que se realizan los cálculos con la palabra clave SOLVE_ORDER.

La palabra clave SOLVE_ORDER especifica el orden de resolución de los miembros calculados en una consulta MDX o en un comando CREATE MEMBER. Los valores de entero utilizados con la palabra clave SOLVE_ORDER son relativos, no necesitan comenzar en cero y no tienen que ser consecutivos. El valor ordena a MDX calcular un miembro según los valores resultantes del cálculo de miembros con un valor superior. Si se define un miembro calculado sin la palabra clave SOLVE_ORDER, su valor predeterminado es cero.

Por ejemplo, si combina los cálculos utilizados en las dos primeras consultas de ejemplo, la intersección de los dos miembros calculados, Year Difference y Profit Margin, se produce en una única celda en el conjunto de datos de resultados del ejemplo de consulta MDX. La única manera de determinar cómo Analysis Services evaluará esta celda es mediante el orden de resolución. Las fórmulas utilizadas para crear esta celda ofrecerán resultados diferentes según del orden de resolución de los dos miembros calculados.

En primer lugar, intente combinar los cálculos utilizados en las dos primeras consultas en la siguiente consulta MDX:

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]

En este ejemplo combinado de consulta MDX, Profit Margin posee el orden de resolución superior, por lo que tendrá prioridad si interactúan las dos expresiones. Analysis Services evalúa dicha celda mediante la fórmula Profit Margin. Los resultados de este cálculo anidado pueden verse en la siguiente tabla.

Internet Sales Amount

Costo total del producto por Internet

Margen de beneficio

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%

El resultado de la celda compartida se basa en la fórmula para Profit Margin. Es decir, Analysis Services calcula el resultado en la celda compartida con los datos de Year Difference y ofrece la siguiente fórmula (se ha redondeado el resultado para obtener mayor claridad):

((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 

o

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

Esto es a todas luces incorrecto. Sin embargo, Analysis Services calcula el resultado en una celda compartida de distinto modo si cambia el orden de resolución de los miembros calculados en la consulta MDX. La siguiente consulta MDX combinada invierte el orden de resolución de los miembros calculados:

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]

Como se ha cambiado el orden de los miembros calculados, Analysis Services utiliza la fórmula Year Difference para evaluar la celda, como se muestra en la siguiente tabla.

Internet Sales Amount

Costo total del producto por Internet

Margen de beneficio

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%)

Puesto que la consulta utiliza la fórmula Year Difference con los datos de Profit Margin, la fórmula de la celda compartida es similar al siguiente cálculo:

(($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 

o bien

0.4145 - 0.4160= -0.15

Consideraciones adicionales

El orden de resolución puede ser un aspecto muy complicado, especialmente en cubos con un gran número de dimensiones que tienen miembros calculados, fórmulas de resúmenes personalizados o celdas calculadas. Cuando Analysis Services evalúa una consulta MDX, Analysis Services tiene en cuenta los valores del orden de resolución de todos los elementos implicados en un paso determinado, incluidas las dimensiones del cubo especificado en la consulta MDX.

Vea también

Referencia

CalculationCurrentPass (MDX)

CalculationPassValue (MDX)

CREATE MEMBER (instrucción MDX)

Otros recursos

Manipular datos (MDX)