Grupos de cálculo

Se aplica a: SQL Server 2019 y versiones posteriores analysis Services Azure Analysis Services Fabric/Power BI Premium

Los grupos de cálculo pueden reducir significativamente el número de medidas redundantes mediante la agrupación de expresiones de medida comunes como elementos de cálculo. Los grupos de cálculo se admiten en modelos tabulares en el nivel de compatibilidad 1500 y superior.

Ventajas

Los grupos de cálculo abordan un problema en los modelos complejos en los que puede haber una proliferación de medidas redundantes mediante los mismos cálculos: lo más común con los cálculos de inteligencia de tiempo. Por ejemplo, un analista de ventas quiere ver los totales de ventas y los pedidos por mes a fecha (MTD), trimestre a fecha (QTD), año a fecha (YTD), pedidos anuales hasta la fecha para el año anterior (PY), etc. El modelador de datos tiene que crear medidas independientes para cada cálculo, lo que puede dar lugar a docenas de medidas. Para el usuario, esto puede significar tener que ordenar por igual que muchas medidas y aplicarlas individualmente a su informe.

Veamos primero cómo aparecen los grupos de cálculo a los usuarios en una herramienta de informes como Power BI. A continuación, veremos qué constituye un grupo de cálculo y cómo se crean en un modelo.

Los grupos de cálculo se muestran en los clientes de informes como una tabla con una sola columna. La columna no es como una columna o dimensión típica, sino que representa uno o varios cálculos reutilizables, o elementos de cálculo que se pueden aplicar a cualquier medida ya agregada al filtro Valores para una visualización.

En la siguiente animación, un usuario analiza los datos de ventas de los años 2012 y 2013. Antes de aplicar un grupo de cálculo, la medida base común Sales calcula una suma de las ventas totales de cada mes. A continuación, el usuario quiere aplicar cálculos de inteligencia de tiempo para obtener totales de ventas de mes a fecha, trimestre a fecha, año hasta fecha, etc. Sin grupos de cálculo, el usuario tendría que seleccionar medidas de inteligencia de tiempo individuales.

Con un grupo de cálculo, en este ejemplo denominado Inteligencia de tiempo, cuando el usuario arrastra el elemento Cálculo de tiempo al área de filtro Columnas , cada elemento de cálculo aparece como una columna independiente. Los valores de cada fila se calculan a partir de la medida base , Sales.

Grupo de cálculo que se aplica en Power BI

Los grupos de cálculo funcionan con medidas DAX explícitas . En este ejemplo, Sales es una medida explícita ya creada en el modelo. Los grupos de cálculo no funcionan con medidas DAX implícitas. Por ejemplo, en Las medidas implícitas de Power BI se crean cuando un usuario arrastra columnas a objetos visuales para ver los valores agregados, sin crear una medida explícita. En este momento, Power BI genera DAX para medidas implícitas escritas como cálculos DAX insertados, lo que significa que las medidas implícitas no pueden funcionar con grupos de cálculo. Se ha introducido una nueva propiedad de modelo visible en el modelo de objetos tabulares (TOM), DiscourageImplicitMeasures. Actualmente, para crear grupos de cálculo, esta propiedad debe establecerse en true. Cuando se establece en true, Power BI Desktop en modo Live Connect deshabilita la creación de medidas implícitas.

Los grupos de cálculo también admiten consultas mdx (expresiones de datos multidimensionales). Esto significa que los usuarios de Microsoft Excel, que consultan modelos de datos tabulares mediante MDX, pueden aprovechar al máximo los grupos de cálculo en tablas dinámicas y gráficos de hojas de cálculo.

Cómo funcionan

Ahora que ha visto cómo los grupos de cálculo benefician a los usuarios, veamos cómo se crea el ejemplo de grupo de cálculo de Inteligencia de tiempo que se muestra.

Antes de entrar en los detalles, vamos a introducir algunas nuevas funciones DAX específicamente para los grupos de cálculo:

SELECTEDMEASURE : se usa en expresiones para los elementos de cálculo para hacer referencia a la medida que se encuentra actualmente en contexto. En este ejemplo, la medida Sales.

SELECTEDMEASURENAME : se usa en expresiones para los elementos de cálculo para determinar la medida que está en contexto por nombre.

ISSELECTEDMEASURE : se usa en expresiones para los elementos de cálculo para determinar la medida que está en contexto se especifica en una lista de medidas.

SELECTEDMEASUREFORMATSTRING : se usa en expresiones para los elementos de cálculo para recuperar la cadena de formato de la medida que está en contexto.

Ejemplo de inteligencia de tiempo

Nombre de tabla: Inteligencia de tiempo
Nombre de columna: cálculo de hora
Precedencia: 20

Elementos de cálculo de Inteligencia de tiempo

Current

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

% AAAA

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

Para probar este grupo de cálculo, ejecute una consulta DAX en SSMS o en DAX Studio de código abierto. Nota: YOY y YOY% se omiten en este ejemplo de consulta.

Consulta de inteligencia de tiempo

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

Devolución de consulta de Inteligencia de tiempo

La tabla de devolución muestra los cálculos de cada elemento de cálculo aplicado. Por ejemplo, vea QTD para marzo de 2012 es la suma de enero, febrero y marzo de 2012.

Devolución de consulta de inteligencia de tiempo

Cadenas de formato dinámico

Las cadenas de formato dinámico con grupos de cálculo permiten la aplicación condicional de cadenas de formato a medidas sin obligarlas a devolver cadenas.

Los modelos tabulares admiten el formato dinámico de las medidas mediante la función FORMAT de DAX. Sin embargo, la función FORMAT tiene la desventaja de devolver una cadena, forzando medidas que, de lo contrario, serían numéricas para que también se devuelvan como una cadena. Esto puede tener algunas limitaciones, como no trabajar con la mayoría de los objetos visuales de Power BI en función de los valores numéricos, como los gráficos.

En Power BI, las cadenas de formato dinámico para las medidas también permiten la aplicación condicional de cadenas de formato a una medida específica sin obligarlas a devolver una cadena y sin el uso de grupos de cálculo. Para más información, consulte Cadenas de formato dinámico para las medidas.

Cadenas de formato dinámico para inteligencia de tiempo

Si observamos el ejemplo de Inteligencia de tiempo mostrado anteriormente, todos los elementos de cálculo excepto YOY% deben usar el formato de la medida actual en contexto. Por ejemplo, YTD calculado en la medida Base de ventas debe ser moneda. Si se trata de un grupo de cálculo para algo como una medida base Orders, el formato sería numérico. Sin embargo, YOY%debe ser un porcentaje independientemente del formato de la medida base.

Para YOY%, podemos invalidar la cadena de formato estableciendo la propiedad de expresión de cadena de formato en 0,00%;-0,00%; 0,00 %. Para obtener más información sobre las propiedades de la expresión de cadena de formato, vea Propiedades de celda MDX - FORMAT STRING Contents.

En este objeto visual de matriz de Power BI, verá Sales Current/YOY y Orders Current/YOY conservan sus respectivas cadenas de formato de medida base. Sin embargo, sales YOY% y Orders YOY%, invalida la cadena de formato para usar el formato de porcentaje.

Inteligencia de tiempo en el objeto visual de matriz

Cadenas de formato dinámico para la conversión de moneda

Las cadenas de formato dinámico proporcionan una conversión de moneda sencilla. Tenga en cuenta el siguiente modelo de datos de Adventure Works. Se modela para la conversión de moneda uno a varios , tal y como se define en Tipos de conversión.

Tasa de moneda en el modelo tabular

Se agrega una columna FormatString a la tabla DimCurrency y se rellena con cadenas de formato para las monedas respectivas.

Columna de cadena de formato

En este ejemplo, el siguiente grupo de cálculo se define como:

Ejemplo de conversión de moneda

Nombre de tabla: Conversión de moneda
Nombre de columna: cálculo de conversión
Prioridad: 5

Elementos de cálculo para la conversión de moneda

Sin conversión

SELECTEDMEASURE()

Moneda convertida

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

Expresión de cadena de formato

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

Nota

Las expresiones de selección para los grupos de cálculo se encuentran actualmente en versión preliminar y se pueden usar para implementar la conversión automática de moneda en grupos de cálculo, lo que elimina la necesidad de tener dos elementos de cálculo independientes.

La expresión de cadena de formato debe devolver una cadena escalar. Usa la nueva función SELECTEDMEASUREFORMATSTRING para revertir a la cadena de formato de medida base si hay varias monedas en el contexto de filtro.

En la animación siguiente se muestra la conversión de moneda de formato dinámico de la medida Sales en un informe.

Cadena de formato dinámico de conversión de moneda aplicada

Expresiones de selección (versión preliminar)

Las expresiones de selección son propiedades opcionales definidas para un grupo de cálculo. Hay dos tipos de expresiones de selección:

  • multipleOrEmptySelectionExpression. Esta expresión de selección se aplica cuando se han seleccionado varios elementos de cálculo, se ha seleccionado un elemento de cálculo no existente o cuando se ha realizado una selección en conflicto.
  • noSelectionExpression. Esta expresión de selección se aplica cuando no se filtra el grupo de cálculo.

Ambas expresiones de selección también tienen una expresión de cadena de formato dinámico formatStringDefinition .

En resumen, en un grupo de cálculo se puede definir lo siguiente:

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

Nota

Estas expresiones, si se especifican, solo se aplican a las situaciones específicas mencionadas. Las selecciones de un solo elemento de cálculo no se ven afectadas por estas expresiones.

Esta es una introducción a estas expresiones y su comportamiento predeterminado si no se especifica:

Tipo de selección Expresión de selección no definida (valor predeterminado) Expresión de selección definida
Selección única Se aplica la selección Se aplica la selección
Selección múltiple El grupo de cálculo no está filtrado Resultado devuelto de la evaluación de multipleOrEmptySelectionExpression
Selección vacía El grupo de cálculo no está filtrado Resultado devuelto de la evaluación de multipleOrEmptySelectionExpression
Sin selección El grupo de cálculo no está filtrado Resultado devuelto de la evaluación de noSelectionExpression

Selección múltiple o vacía

Si se realizan varias selecciones en el mismo grupo de cálculo, el grupo de cálculo evaluará y devolverá el resultado de multipleOrEmptySelectionExpression si se define. Si esta expresión no se ha definido, el grupo de cálculo devolverá el resultado siguiente:

SELECTEDMEASURE()

Por ejemplo, echemos un vistazo a un grupo de cálculo denominado MyCalcGroup que tiene un multipleOrEmptySelectionExpression configurado de la siguiente manera:

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

Ahora imagine la siguiente selección en el grupo de cálculo:

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

Aquí, seleccionamos dos elementos en el grupo de cálculo, "item1" y "item2". Se trata de una selección múltiple y, por lo tanto, multipleOrEmptySelectionExpression se evalúa y devuelve el siguiente resultado: "Filtros: item1, item2".

A continuación, tome la siguiente selección en el grupo de cálculo:

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

Este es un ejemplo de una selección vacía, ya que "item4" no existe en este grupo de cálculo. Por lo tanto, multipleOrEmptySelectionExpression se evalúa y devuelve el siguiente resultado: "Filters: ".

Sin selección

NoSelectionExpression en un grupo de cálculo se aplicará si no se ha filtrado el grupo de cálculo. Esto se usa principalmente para realizar acciones predeterminadas sin necesidad de que el usuario realice una acción, a la vez que proporciona flexibilidad al usuario para invalidar la acción predeterminada. Por ejemplo, echemos un vistazo a la conversión automática de moneda con dólar estadounidense como moneda dinámica central.

Podemos configurar un grupo de cálculo con el siguiente noSelectionExpression:

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

También estableceremos un formatStringDefinition para esta expresión:

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

Ahora, si no se selecciona ninguna moneda, todas las divisas se convertirán automáticamente en la moneda dinámica (dólar estadounidense) según sea necesario. Además, puede elegir otra moneda para convertir a esa moneda sin tener que cambiar los elementos de cálculo como tendría que hacer sin la noSelectionExpression.

Prioridad

Precedencia es una propiedad definida para un grupo de cálculo. Especifica el orden en que se combinan los grupos de cálculo con la medida subyacente cuando se usa SELECTEDMEASURE() en el elemento de cálculo.

Ejemplo de precedencia

Veamos un ejemplo sencillo. Este modelo tiene una medida con un valor especificado de 10 y dos grupos de cálculo, cada uno con un solo elemento de cálculo. Vamos a aplicar los elementos de cálculo del grupo de cálculo a la medida. Así es como lo configuramos:

'Measure group'[Measure] = 10

El primer grupo de cálculo es 'Calc Group 1 (Precedence 100)' y el elemento de cálculo es 'Calc item (Plus 2)':

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

El segundo grupo de cálculo es 'Calc Group 2 (Precedence 200)' y el elemento de cálculo es 'Calc item (Times 2)':

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

Puede ver que el grupo de cálculo 1 tiene un valor de precedencia de 100 y el grupo de cálculo 2 tiene un valor de precedencia de 200.

Mediante SQL Server Management Studio (SSMS) o una herramienta externa con características de lectura y escritura XMLA, como el Editor tabular de código abierto, puede usar scripts XMLA para crear grupos de cálculo y establecer los valores de precedencia. Aquí agregamos "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"
          }
        }
      ]
    }
  }
}

Y este script agrega "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"
          }
        }
      ]
    }
  }
}

En Power BI Desktop, tenemos un objeto visual de tarjeta que muestra la medida y una segmentación de datos para cada uno de los grupos de cálculo de la vista de informe:

Expresiones independientes del grupo de medida.

Cuando se seleccionan ambas segmentaciones, es necesario combinar las expresiones DAX. Para ello, empezamos con el elemento de cálculo de precedencia más alto, 200 y, a continuación, reemplazamos el argumento SELECTEDMEASURE() por el siguiente más alto, 100.

Por lo tanto, nuestra expresión DAX de elemento de cálculo de precedencia más alta es:

SELECTEDMEASURE() * 2 

Y nuestra segunda expresión DAX de elemento de cálculo de precedencia más alta es:

SELECTEDMEASURE() + 2 

Ahora se combinan reemplazando la parte SELECTEDMEASURE() del elemento de cálculo de precedencia más alta por el siguiente elemento de cálculo de precedencia más alto, de la siguiente manera:

( SELECTEDMEASURE() + 2 ) * 2

Después, si hay más elementos de cálculo, seguimos hasta que lleguemos a la medida subyacente. Solo hay dos grupos de cálculo en este modelo, por lo que ahora reemplazamos SELECTEDMEASURE() por la propia medida, como esta:

( ( [Measure] ) + 2 ) * 2

Como nuestro Measure = 10, esto es lo mismo que:

( ( 10 ) + 2 ) * 2

Cuando no hay más argumentos SELECTEDMEASURE(), se evalúa la expresión DAX combinada:

( ( 10 ) + 2 ) * 2 = 24

En Power BI Desktop, cuando se aplican ambos grupos de cálculo con una segmentación de datos, la salida de la medida tiene este aspecto:

Expresiones combinadas de grupo de medida.

Pero tenga en cuenta que la combinación está anidada de tal manera que la salida no será de 10 + 2 * 2 = 14 como se ve aquí:

Expresiones anidadas de grupo de medida.

En el caso de las transformaciones simples, la evaluación va de menor a mayor prioridad. Por ejemplo, 10 tiene 2 agregados y, a continuación, se multiplica por 2. En DAX, hay funciones como CALCULATE que aplican filtros o cambios de contexto a expresiones internas. En este caso, la prioridad más alta modifica una expresión de precedencia inferior.

La precedencia también determina qué cadena de formato dinámico se aplica a la expresión DAX combinada para cada medida. La cadena de formato dinámico del grupo de cálculo de precedencia más alta es la única aplicada. Si una medida tiene una cadena de formato dinámico, se considera una prioridad más baja para cualquier grupo de cálculo del modelo.

Ejemplo de precedencia con promedios

Echemos un vistazo a otro ejemplo con el mismo modelo que se muestra en el ejemplo de inteligencia de tiempo descrito anteriormente en este artículo. Pero esta vez, vamos a agregar también un grupo de cálculo Averages . El grupo de cálculo Averages contiene cálculos promedio que son independientes de la inteligencia de tiempo tradicional en que no cambian el contexto de filtro de fecha; simplemente aplican cálculos promedio dentro de él.

En este ejemplo, se define un cálculo medio diario. Los cálculos como el promedio de barriles de petróleo al día son comunes en las aplicaciones de petróleo y gas. Otros ejemplos empresariales comunes incluyen la media de ventas de la tienda en el comercio minorista.

Aunque estos cálculos se calculan independientemente de los cálculos de inteligencia de tiempo, puede haber un requisito para combinarlos. Por ejemplo, un usuario podría querer ver barriles de petróleo por día YTD para ver la tasa diaria del petróleo desde el principio del año hasta la fecha actual. En este escenario, la prioridad debe establecerse para los elementos de cálculo.

Nuestras suposiciones son:

El nombre de la tabla es Averages.
El nombre de columna es Cálculo medio.
La prioridad es 10.

Elementos de cálculo para promedios

Sin promedio

SELECTEDMEASURE()

Promedio diario

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Este es un ejemplo de una consulta DAX y una tabla de devolución:

Consulta de promedios

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
)

Promedios de devolución de consulta

Promedios de devolución de consulta

En la tabla siguiente se muestra cómo se calculan los valores de marzo de 2012.

Nombre de la columna Cálculo
YTD Suma de ventas para enero, febrero de 2012
= 495,364 + 506,994 + 373,483
Promedio diario Ventas de marzo de 2012 divididas por número de días en marzo
= 373,483 / 31
Promedio diario de YTD YTD para mar 2012 dividido por el número de días en enero, febrero y mar
= 1,375,841 / (31 + 29 + 31)

Esta es la definición del elemento de cálculo YTD, aplicado con prioridad de 20.

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

Este es el promedio diario, aplicado con una prioridad de 10.

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Dado que la prioridad del grupo de cálculo de Inteligencia de tiempo es mayor que la del grupo de cálculo Promedios, se aplica lo más amplia posible. El cálculo promedio diario de YTD aplica YTD tanto al numerador como al denominador (recuento de días) del cálculo medio diario.

Esto equivale a la siguiente expresión:

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

No esta expresión:

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

Recursividad lateral

En el ejemplo de Inteligencia de tiempo anterior, algunos de los elementos de cálculo hacen referencia a otros en el mismo grupo de cálculo. Esto se denomina recursividad lateral. Por ejemplo, YOY% hace referencia a YOY y PY.

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

En este caso, ambas expresiones se evalúan por separado porque usan instrucciones calculate diferentes. No se admiten otros tipos de recursividad.

Elemento de cálculo único en el contexto de filtro

En nuestro ejemplo de Inteligencia de tiempo, el elemento de cálculo py YTD tiene una expresión de cálculo única:

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

El argumento YTD de la función CALCULATE() invalida el contexto de filtro para reutilizar la lógica ya definida en el elemento de cálculo YTD. No es posible aplicar PY e YTD en una sola evaluación. Los grupos de cálculo solo se aplican si un único elemento de cálculo del grupo de cálculo está en contexto de filtro.

Ordenación

De forma predeterminada, cuando se coloca una columna de un grupo de cálculo en un informe, los elementos de cálculo se ordenan alfabéticamente por nombre. El orden en el que los elementos de cálculo aparecen en un informe se pueden cambiar especificando la propiedad Ordinal. Especificar el orden de los elementos de cálculo con la propiedad Ordinal no cambia la prioridad, el orden en el que se evalúan los elementos de cálculo. Tampoco cambia el orden en que los elementos de cálculo aparecen en el Explorador de modelos tabulares.

Para especificar la propiedad ordinal para los elementos de cálculo, debe agregar una segunda columna al grupo de cálculo. A diferencia de la columna predeterminada donde Tipo de datos es Text, una segunda columna usada para ordenar los elementos de cálculo tiene un tipo de datos Número entero. El único propósito de esta columna es especificar el orden numérico en el que aparecen los elementos de cálculo del grupo de cálculo. Dado que esta columna no proporciona ningún valor en un informe, es mejor establecer la propiedad Hidden en True.

Columna para ordenar

Después de agregar una segunda columna al grupo de cálculo, puede especificar el valor de la propiedad Ordinal para los elementos de cálculo que desea ordenar.

Ordinal (propiedad)

Para obtener más información, consulte Para ordenar los elementos de cálculo.

Crear un grupo de cálculo

Los grupos de cálculo se admiten en Visual Studio con la actualización VSIX de proyectos de Analysis Services 2.9.2 y versiones posteriores. Los grupos de cálculo también se pueden crear mediante el lenguaje de scripting de modelos tabulares (TMSL) o el Editor tabular de código abierto.

Para crear un grupo de cálculo mediante Visual Studio

  1. En el Explorador de modelos tabulares, haga clic con el botón derecho en Grupos de cálculo y, a continuación, haga clic en Nuevo grupo de cálculo. De forma predeterminada, un nuevo grupo de cálculo tiene una sola columna y un único elemento de cálculo.

  2. Use Propiedades para cambiar el nombre y escribir una descripción para el grupo de cálculo, la columna y el elemento de cálculo predeterminado.

  3. Para escribir una expresión de fórmula DAX para el elemento de cálculo predeterminado, haga clic con el botón derecho y, a continuación, haga clic en Editar fórmula para abrir dax Editor. Escriba una expresión válida.

  4. Para agregar más elementos de cálculo, haga clic con el botón derecho en Elementos de cálculo y, a continuación, haga clic en Nuevo elemento de cálculo.

Para ordenar los elementos de cálculo

  1. En el Explorador de modelos tabulares, haga clic con el botón derecho en un grupo de cálculo y, a continuación, haga clic en Agregar columna.

  2. Asigne un nombre a la columna Ordinal (o algo similar), escriba una descripción y, a continuación, establezca la propiedad Hidden en True.

  3. Para cada elemento de cálculo que desee ordenar, establezca la propiedad Ordinal en un número positivo. Cada número es secuencial, por ejemplo, un elemento de cálculo con una propiedad Ordinal de 1 aparece primero, aparece una propiedad de 2 segundos, etc. Los elementos de cálculo con el valor predeterminado -1 no se incluyen en el orden, pero aparecen antes de los elementos ordenados en un informe.

Limitaciones

No se admite la seguridad de nivel de objeto (OLS) definida en las tablas de grupo de cálculo. Sin embargo, OLS se puede definir en otras tablas del mismo modelo. Si un elemento de cálculo hace referencia a un objeto protegido OLS, se devuelve un error genérico.

No se admite la seguridad de nivel de fila (RLS). Defina RLS en tablas del mismo modelo, pero no en los propios grupos de cálculo (directa o indirectamente).

Las expresiones de filas de detalles no se admiten con grupos de cálculo.

Narración inteligente objetos visuales en Power BI no se admiten con grupos de cálculo.

No se admiten agregaciones de columna implícitas en Power BI para modelos con grupos de cálculo. Actualmente, si la propiedad DiscourageImplicitMeasures está establecida en false (valor predeterminado), aparecen opciones de agregación, pero no se pueden aplicar. Si DiscourageImplicitMeasures está establecido en true, las opciones de agregación no aparecen.

Al crear informes de Power BI mediante LiveConnection, las cadenas de formato dinámico no se aplican a las medidas de nivel de informe.

Consulte también

DAX en los modelos tabulares
Referencia de DAX