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 modelos complejos en los que puede haber una proliferación de medidas redundantes mediante los mismos cálculos: más comunes 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 de año a fecha para el año anterior (PY), etc. El modelador de datos tiene que crear medidas independientes para cada cálculo, lo que puede provocar docenas de medidas. Para el usuario, esto puede significar tener que revisar numerosas medidas y aplicarlas individualmente en 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 lo que compone 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 está analizando los datos de ventas durante 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 los totales de ventas del mes a la fecha, trimestre a fecha, año a 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.
Los grupos de cálculo funcionan con medidas DAX explícitas . En este ejemplo, Sales es una medida explícita que ya se ha creado 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 en línea, lo que significa que las medidas implícitas no pueden trabajar 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 de expresiones de datos multidimensionales (MDX). 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 de hoja de cálculo y gráficos.
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 funciones DAX nuevas específicamente para los grupos de cálculo:
SELECTEDMEASURE : se utiliza en expresiones de elementos de cálculo para hacer referencia a la medida actualmente en contexto. En este ejemplo, la medida de Ventas.
SELECTEDMEASURENAME : se usa en expresiones para los elementos de cálculo para determinar la medida que se encuentra en contexto por nombre.
ISSELECTEDMEASURE: Se utiliza en expresiones para los elementos de cálculo, para determinar si la medida que está en contexto está especificada 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 temporal
Nombre de tabla: Inteligencia de tiempo
Nombre de columna: cálculo de hora
Prioridad: 20
Elementos de cálculo de inteligencia temporal
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"
)
YOY%
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 temporal
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 }
)
Resultado de consulta de inteligencia de tiempo
En la tabla de retorno se muestran los cálculos de cada elemento de cálculo aplicado. Por ejemplo, considere que QTD para marzo de 2012 es la suma de enero, febrero y marzo de 2012.
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 forzarlas 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 forzarlos 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 medidas.
Cadenas de formato dinámico para la 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 sobre la medida de la base de ventas debe expresarse en moneda. Si se trata de un grupo de cálculo para algo parecido a una medida base Orders, el formato sería numérico. YoY%, sin embargo, 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, consulte MDX Cell Properties - FORMAT STRING Contents.
En esta visualización de matriz de Power BI, ves que Sales Current/YOY y Orders Current/YOY conservan sus respectivos formatos básicos de medida. Sin embargo, las ventas interanuales% y los pedidos interanuales%, anulan la cadena de formato para utilizar el formato de porcentaje.
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 uno a varios de moneda, tal como se define en Tipos de conversión.
Se agrega una columna FormatString a la tabla DimCurrency y se rellena con cadenas de formato para las monedas respectivas.
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
Precedencia: 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 formateada
SELECTEDVALUE(
DimCurrency[FormatString],
SELECTEDMEASUREFORMATSTRING()
)
Nota:
Las expresiones de selección para 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, eliminando 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.
La siguiente animación muestra la conversión de formato dinámico de moneda de la medida Sales en un informe.
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 no se ha definido esta expresión, 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 una expresión multipleOrEmptySelectionExpression configurada 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 tanto, se evalúa multipleOrEmptySelectionExpression y devuelve el siguiente resultado: "Filters: 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, se evalúa multipleOrEmptySelectionExpression y devuelve el siguiente resultado: "Filters: ".
Sin selección
La expresión NoSelectionExpression en un grupo de cálculo se aplicará si el grupo no ha sido filtrado. Esto se usa principalmente para realizar acciones predeterminadas sin necesidad de que el usuario tome medidas, 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 divisas con dólar estadounidense como moneda dinámica central.
Podemos configurar un grupo de cálculo con la siguiente expresión sin selección:
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 monedas se convertirán automáticamente en la moneda dinámica (dólar estadounidense) según sea necesario. Además, puedes elegir otra moneda para convertirla a esa moneda sin tener que cambiar los elementos de cálculo como tendrías que hacer sin la noSelectionExpression.
Precedencia
Precedencia es una propiedad definida para un grupo de cálculo. Especifica el orden en que los grupos de cálculo se combinan con la medida subyacente al usar 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 de ambos grupos 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.
Con 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 una visualización de tarjeta que muestra una medida y una segmentación para cada uno de los grupos de cálculo en la vista de informe:
Cuando se seleccionan ambos filtros, debemos 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 para el elemento de cálculo con la precedencia más alta es:
SELECTEDMEASURE() * 2
Y nuestra expresión DAX del segundo 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
A continuación, si hay más elementos de cálculo, seguimos hasta llegar a la medida subyacente. Solo hay dos grupos de cálculo en este modelo, por lo que ahora reemplazamos SELECTEDMEASURE() por la propia medida, de la siguiente manera:
( ( [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 un segmentador, el resultado de la medida tiene este aspecto:
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í:
Para 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 única cadena de formato dinámico aplicada es la del grupo de cálculo con la mayor precedencia. Si una medida tiene una cadena de formato dinámico, se considera una prioridad menor 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 barricas de petróleo al día son comunes en las aplicaciones de petróleo y gas. Otros ejemplos empresariales comunes incluyen el promedio de ventas de la tienda en el comercio minorista.
Aunque estos cálculos se realizan independientemente de los cálculos de tiempo inteligente, puede haber una necesidad de combinarlos. Por ejemplo, un usuario podría querer ver barriles de petróleo por día desde el principio del año hasta la fecha actual para ver la tasa diaria de petróleo. 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.
Ítems 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 resultados.
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
En la tabla siguiente se muestra cómo se calculan los valores de marzo de 2012.
Nombre de columna | Cálculo |
---|---|
Año hasta la fecha | Suma de ventas de enero, febrero y marzo de 2012 = 495,364 + 506,994 + 373,483 |
Promedio diario | Ventas de marzo de 2012 divididas por # de días en marzo = 373,483 / 31 |
Promedio diario de YTD | YTD para mar 2012 dividido por # 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 precedencia del grupo de cálculo de Inteligencia de Tiempo es mayor que la del grupo de cálculo de Promedios, se aplica lo más ampliamente posible. El cálculo promedio diario de YTD aplica YTD al numerador y 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 del 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 diferentes instrucciones de cálculo. No se admiten otros tipos de recursividad.
Elemento de cálculo único en el contexto de filtro
En nuestro ejemplo de Inteligencia temporal, 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 solo elemento de cálculo del grupo de cálculo está en contexto de filtro.
Pedido
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 el que aparecen los elementos de cálculo 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 Texto, 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.
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.
Para obtener más información, consulte Para ordenar los elementos de cálculo.
Creación de un grupo de cálculo
Los grupos de cálculo se admiten en Visual Studio con Analysis Services Projects VSIX Update 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
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 solo elemento de cálculo.
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.
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 el Editor DAX. Escriba una expresión válida.
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
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.
Asigne un nombre a la columna Ordinal (o algo similar), escriba una descripción y, a continuación, establezca la propiedad Hidden en True.
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, una propiedad de 2 aparece en segundo lugar, etc. Los elementos de cálculo con el -1 predeterminado no se incluyen en el orden, pero aparecen antes de los elementos ordenados en un informe.
Consideraciones
En cuanto se agrega un grupo de cálculo a un modelo semántico, los informes de Power BI usarán el tipo de datos variant para todas las medidas. Si después, todos los grupos de cálculo se quitan del modelo, las medidas se devolverán de nuevo a sus tipos de datos originales.
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 detalladas no son compatibles con los grupos de cálculo.
Los objetos visuales de narración inteligente 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.