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 una secuencia de comandos 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.

La tabla de hechos y los datos de reescritura sólo afectan al paso 0. Las secuencias de comandos llenan los datos tras el paso 0; cada asignación e instrucción de cálculo de una secuencia de comandos crea un nuevo paso. Fuera de la secuencia de comandos MDX, las referencias al paso absoluto 0 hacen referencia al último paso creado por la secuencia de comandos 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 2005 Analysis Services (SSAS) 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 posterior al valor predeterminado de la fórmula de resumen personalizado de -5119. Este valor inferior de orden de resolución permite calcular antes los miembros calculados que las fórmulas de resumen personalizado y puede provocar 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.

Consulta 1—Diferencias de Income y Expenses

En la primera consulta MDX, para ver la diferencia de ingresos y gastos para cada semestre del año, debe crear una consulta MDX simple similar al siguiente ejemplo:

WITH
MEMBER [Time].[Year Difference] AS
   [Time].[2nd half] - [Time].[1st half]
SELECT 
   { [Account].[Income], [Account].[Expenses] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials

En esta consulta, sólo existe un miembro calculado: Year Difference. Dado que sólo 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.

Income Expenses

1st half

5000

4200

2nd half

8000

7000

Year Difference

3000

2800

Consulta 2—Porcentaje de Net Income después de Expenses

En la segunda consulta, para ver el porcentaje de ingresos netos después de gastos para cada semestre del año, utilice la siguiente consulta MDX:

WITH
MEMBER [Account].[Net Income] AS
   ([Account].[Income],  [Account].[Expenses]) / [Account].[Income]
SELECT
   { [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half] } ON ROWS
FROM Financials

En esta consulta MDX, al igual que en la anterior, sólo existe un miembro calculado, Net Income, 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.

Income Expenses Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

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 última consulta en la que se combinan los dos ejemplos anteriores en una única consulta MDX, el orden de resolución resulta importante. Para garantizar 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 Net Income, 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 [Time].[Year Difference] AS
   '[Time].[2nd half] - [Time].[1st half],
   SOLVE_ORDER = 1
MEMBER [Account].[Net Income] AS
   '([Account].[Income] - [Account].[Expenses]) / [Account].[Income]',
   SOLVE_ORDER = 2
SELECT
   { [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials

En este ejemplo combinado de consulta MDX, Net Income 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 Net Income. Los resultados de este cálculo anidado pueden verse en la siguiente tabla.

Income Expenses Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

Year Difference

3000

2800

0.066

El resultado de la celda compartida se basa en la fórmula para Net Income. 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):

((8000 - 5000) - (7000 - 4200)) / (8000 - 5000) = 0.066 

o bien

(3000 - 2800) / 3000 = 0.066

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 [Time].[Year Difference] AS
   '[Time].[2nd half] - [Time].[1st half],
   SOLVE_ORDER = 2
MEMBER [Money].[Net Income] AS
   '([Money].[Income] - [Money].[Expenses]) / [Money].[Income]',
   SOLVE_ORDER = 1
SELECT
   { [Money].[Income], [Money].[Expenses], [Money].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM TestCube

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.

Income Expenses Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

Year Difference

3000

2800

-0.035

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

((8000 - 7000) / 8000) - ((5000 - 4200) / 5000) = -0.035 

o bien

0.125 - 0.16 = -0.035

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)

Ayuda e información

Obtener ayuda sobre SQL Server 2005