Grupos de cálculo
Aplica-se a: SQL Server 2019 e posteriores do Analysis Services Azure Analysis Services Fabric/Power BI Premium
Os grupos de cálculo podem reduzir significativamente o número de medidas redundantes agrupando expressões de medida comuns como itens de cálculo. Os grupos de cálculo têm suporte em modelos tabulares no nível de compatibilidade 1500 e superior.
Benefícios
Os grupos de cálculo abordam um problema em modelos complexos em que pode haver uma proliferação de medidas redundantes usando os mesmos cálculos – mais comuns com cálculos de inteligência de tempo. Por exemplo, um analista de vendas deseja exibir totais de vendas e pedidos por MTD (mês a data), QTD (trimestre a data), YTD (ano a ano), pedidos ano a ano para o ano anterior (PY) e assim por diante. O modelador de dados precisa criar medidas separadas para cada cálculo, o que pode levar a dezenas de medidas. Para o usuário, isso pode significar ter que classificar o máximo de medidas e aplicá-las individualmente ao relatório.
Primeiro, vamos examinar como os grupos de cálculo aparecem para os usuários em uma ferramenta de relatório como o Power BI. Em seguida, examinaremos o que compõe um grupo de cálculo e como eles são criados em um modelo.
Grupos de cálculos são mostrados em clientes de relatório como uma tabela com uma única coluna. A coluna não é como uma coluna ou dimensão típica, em vez disso, representa um ou mais cálculos reutilizáveis ou itens de cálculo que podem ser aplicados a qualquer medida já adicionada ao filtro Valores para uma visualização.
Na animação a seguir, um usuário está analisando dados de vendas para os anos de 2012 e 2013. Antes de aplicar um grupo de cálculo, a medida base comum Sales calcula uma soma do total de vendas para cada mês. Em seguida, o usuário deseja aplicar cálculos de inteligência de tempo para obter totais de vendas para o mês até o momento, trimestre até a data, ano até o momento e assim por diante. Sem grupos de cálculo, o usuário teria que selecionar medidas individuais de inteligência de tempo.
Com um grupo de cálculo, neste exemplo chamado Inteligência de Tempo, quando o usuário arrasta o item Cálculo de Tempo para a área de filtro Colunas , cada item de cálculo aparece como uma coluna separada. Os valores de cada linha são calculados a partir da medida base, Sales.
Os grupos de cálculo funcionam com medidas DAX explícitas . Neste exemplo, Sales é uma medida explícita já criada no modelo. Os grupos de cálculo não funcionam com medidas DAX implícitas. Por exemplo, nas medidas implícitas do Power BI são criadas quando um usuário arrasta colunas para visuais para exibir valores agregados, sem criar uma medida explícita. Neste momento, o Power BI gera DAX para medidas implícitas escritas como cálculos DAX embutidos , o que significa que medidas implícitas não podem funcionar com grupos de cálculo. Uma nova propriedade de modelo visível no TOM (Modelo de Objeto Tabular) foi introduzida, DiscourageImplicitMeasures. Atualmente, para criar grupos de cálculo, essa propriedade deve ser definida como true. Quando definido como true, Power BI Desktop no modo Live Connect desabilita a criação de medidas implícitas.
Os grupos de cálculo também dão suporte a consultas MDX (Expressões de Dados Multidimensionais). Isso significa que os usuários do Microsoft Excel, que consultam modelos de dados tabulares usando MDX, podem aproveitar ao máximo os grupos de cálculo em tabelas dinâmicas e gráficos da planilha.
Como eles funcionam
Agora que você viu como os grupos de cálculo beneficiam os usuários, vamos ver como o exemplo de grupo de cálculo do Time Intelligence mostrado é criado.
Antes de entrarmos em detalhes, vamos introduzir algumas novas funções DAX especificamente para grupos de cálculo:
SELECTEDMEASURE – usado por expressões para itens de cálculo para fazer referência à medida que está atualmente em contexto. Neste exemplo, a medida Vendas.
SELECTEDMEASURENAME - Usado por expressões para itens de cálculo para determinar a medida que está no contexto por nome.
ISSELECTEDMEASURE – usado por expressões para itens de cálculo para determinar a medida que está no contexto é especificada em uma lista de medidas.
SELECTEDMEASUREFORMATSTRING - Usado por expressões para itens de cálculo para recuperar a cadeia de caracteres de formato da medida que está no contexto.
Exemplo de Inteligência de Tempo
Nome da tabela – Inteligência de Tempo
Nome da coluna – Cálculo de tempo
Precedência - 20
Itens de cálculo do Time Intelligence
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 testar esse grupo de cálculo, execute uma consulta DAX no SSMS ou no DAX Studio de software livre. Observação: YOY e YOY% são omitidos deste exemplo de consulta.
Consulta de Inteligência de Tempo
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 }
)
Retorno da consulta do Time Intelligence
A tabela de retorno mostra cálculos para cada item de cálculo aplicado. Por exemplo, consulte QTD para março de 2012 é a soma de janeiro, fevereiro e março de 2012.
Cadeias de caracteres de formato dinâmico
Cadeias de caracteres de formato dinâmico com grupos de cálculo permitem que a aplicação condicional de cadeias de caracteres de formato seja medida sem forçá-las a retornar cadeias de caracteres.
Os modelos tabulares dão suporte à formatação dinâmica de medidas usando a função FORMAT do DAX. No entanto, a função FORMAT tem a desvantagem de retornar uma cadeia de caracteres, forçando medidas que, de outra forma, seriam numéricas a também serem retornadas como uma cadeia de caracteres. Isso pode ter algumas limitações, como não trabalhar com a maioria dos visuais do Power BI dependendo de valores numéricos, como gráficos.
No Power BI, as cadeias de caracteres de formato dinâmico para medidas também permitem a aplicação condicional de cadeias de caracteres de formato a uma medida específica sem forçá-las a retornar uma cadeia de caracteres e sem o uso de grupos de cálculo. Para saber mais, confira Cadeias de caracteres de formato dinâmico para obter medidas.
Cadeias de caracteres de formato dinâmico para inteligência de tempo
Se examinarmos o exemplo de Inteligência de Tempo mostrado acima, todos os itens de cálculo, exceto YOY%, deverão usar o formato da medida atual no contexto. Por exemplo, o YTD calculado na medida base De vendas deve ser moeda. Se esse fosse um grupo de cálculo para algo como uma medida base orders, o formato seria numérico. YOY%, no entanto, deve ser um percentual independentemente do formato da medida base.
Para YOY%, podemos substituir a cadeia de caracteres de formato definindo a propriedade de expressão de cadeia de caracteres de formato como 0,00%;-0,00%; 0,00%. Para saber mais sobre as propriedades de expressão de cadeia de caracteres de formato, consulte Propriedades da célula MDX – CONTEÚDO FORMAT STRING.
Neste visual de matriz no Power BI, você verá Sales Current/YOY e Orders Current/YOY manterem suas respectivas cadeias de caracteres de formato de medida base. Vendas YOY% e Orders YOY%, no entanto, substitui a cadeia de caracteres de formato para usar o formato percentual .
Cadeias de caracteres de formato dinâmico para conversão de moeda
Cadeias de caracteres de formato dinâmico fornecem conversão de moeda fácil. Considere o seguinte modelo de dados do Adventure Works. Ele é modelado para conversão de moeda de um para muitos , conforme definido por tipos de conversão.
Uma coluna FormatString é adicionada à tabela DimCurrency e preenchida com cadeias de caracteres de formato para as respectivas moedas.
Para este exemplo, o seguinte grupo de cálculo é definido como:
Exemplo de conversão de Conversor de Moedas
Nome da tabela – Conversão de Conversor de Moedas
Nome da coluna – Cálculo de conversão
Precedência - 5
Itens de cálculo para conversão de Conversor de Moedas
Sem conversão
SELECTEDMEASURE()
Conversor de Moedas convertido
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]) ) )
)
)
Formatar expressão de cadeia de caracteres
SELECTEDVALUE(
DimCurrency[FormatString],
SELECTEDMEASUREFORMATSTRING()
)
Observação
As expressões de seleção para grupos de cálculo estão atualmente em versão prévia e podem ser usadas para implementar a conversão automática de moeda em grupos de cálculo, removendo a necessidade de ter dois itens de cálculo separados.
A expressão de cadeia de caracteres de formato deve retornar uma cadeia de caracteres escalar. Ele usa a nova função SELECTEDMEASUREFORMATSTRING para reverter à cadeia de caracteres de formato de medida base se houver várias moedas no contexto de filtro.
A animação a seguir mostra a conversão de moeda de formato dinâmico da medida Vendas em um relatório.
Expressões de seleção (versão prévia)
Expressões de seleção são propriedades opcionais definidas para um grupo de cálculo. Há dois tipos de expressões de seleção:
- multipleOrEmptySelectionExpression. Essa expressão de seleção é aplicada quando vários itens de cálculo foram selecionados, um item de cálculo não existente foi selecionado ou quando uma seleção conflitante foi feita.
- noSelectionExpression. Essa expressão de seleção é aplicada quando o grupo de cálculo não é filtrado.
Ambas as expressões de seleção também têm uma expressão de cadeia de caracteres de formato dinâmico formatStringDefinition.
Em resumo, em um grupo de cálculo, o seguinte pode ser definido:
...
"calculationGroup": {
"multipleOrEmptySelectionExpression": {
"expression": "",
"formatStringDefinition": {...}
},
"noSelectionExpression": {
"expression": "",
"formatStringDefinition": {...}
}
...
}
Observação
Essas expressões, se especificadas, só são aplicadas para as situações específicas mencionadas. As seleções de um único item de cálculo não são afetadas por essas expressões.
Aqui está uma visão geral dessas expressões e seu comportamento padrão se não for especificado:
Tipo de seleção | Expressão de seleção não definida (padrão) | Expressão de seleção definida |
---|---|---|
Seleção única | A seleção é aplicada | A seleção é aplicada |
Seleção múltipla | O grupo de cálculo não é filtrado | Retornar o resultado da avaliação de multipleOrEmptySelectionExpression |
Seleção vazia | O grupo de cálculo não é filtrado | Retornar o resultado da avaliação de multipleOrEmptySelectionExpression |
Nenhuma seleção | O grupo de cálculo não é filtrado | Resultado de retorno da avaliação de noSelectionExpression |
Seleção múltipla ou vazia
Se várias seleções no mesmo grupo de cálculo forem feitas, o grupo de cálculo avaliará e retornará o resultado de multipleOrEmptySelectionExpression, se definido. Se essa expressão não tiver sido definida, o grupo de cálculo retornará o seguinte resultado:
SELECTEDMEASURE()
Por exemplo, vamos examinar um grupo de cálculo chamado MyCalcGroup que tem um multipleOrEmptySelectionExpression configurado da seguinte maneira:
IF (
ISFILTERED ( 'MyCalcGroup' ),
"Filters: "
& CONCATENATEX (
FILTERS ( 'MyCalcGroup'[Name] ),
'MyCalcGroup'[Name],
", "
)
)
Agora, imagine a seguinte seleção no grupo de cálculo:
EVALUATE
{
CALCULATE (
[MyMeasure],
'MyCalcGroup'[Name] = "item1" || 'MyCalcGroup'[Name] = "item2"
)
}
Aqui, selecionamos dois itens no grupo de cálculo, "item1" e "item2". Essa é uma seleção múltipla e, portanto, multipleOrEmptySelectionExpression é avaliada e retorna o seguinte resultado: "Filtros: item1, item2".
Em seguida, faça a seguinte seleção no grupo de cálculo:
EVALUATE
{
CALCULATE (
[MyMeasure],
'MyCalcGroup'[Name] = "item4" -- item4 does not exists
)
}
Este é um exemplo de uma seleção vazia, pois "item4" não existe nesse grupo de cálculo. Portanto, multipleOrEmptySelectionExpression é avaliado e retorna o seguinte resultado: "Filtros: ".
Nenhuma seleção
O noSelectionExpression em um grupo de cálculo será aplicado se o grupo de cálculo não tiver sido filtrado. Isso é usado principalmente para executar ações padrão sem a necessidade de o usuário tomar medidas enquanto ainda fornece flexibilidade ao usuário para substituir a ação padrão. Por exemplo, vamos examinar a conversão automática de moeda com Dólar americano como a moeda dinâmica central.
Podemos configurar um grupo de cálculo com o seguinte 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] ) )
)
)
)
Também definiremos um formatStringDefinition para esta expressão:
SELECTEDVALUE(
DimCurrency[FormatString],
SELECTEDMEASUREFORMATSTRING()
)
Agora, se nenhuma moeda for selecionada, todas as moedas serão convertidas automaticamente na moeda dinâmica (Dólar Americano), conforme necessário. Além disso, você ainda pode escolher outra moeda para converter nessa moeda sem precisar alternar itens de cálculo, como teria que fazer sem o noSelectionExpression.
Precedência
Precedência é uma propriedade definida para um grupo de cálculo. Ele especifica a ordem em que os grupos de cálculo são combinados com a medida subjacente ao usar SELECTEDMEASURE() no item de cálculo.
Exemplo de precedência
Vejamos um exemplo simples. Esse modelo tem uma medida com um valor especificado de 10 e dois grupos de cálculo, cada um com um único item de cálculo. Vamos aplicar os dois itens de cálculo do grupo de cálculo à medida. É assim que configuramos:
'Measure group'[Measure] = 10
O primeiro grupo de cálculo é 'Calc Group 1 (Precedence 100)'
e o item de cálculo é 'Calc item (Plus 2)'
:
'Calc Group 1 (Precedence 100)'[Calc item (Plus 2)] = SELECTEDMEASURE() + 2
O segundo grupo de cálculo é 'Calc Group 2 (Precedence 200)'
e o item de cálculo é 'Calc item (Times 2)'
:
'Calc Group 2 (Precedence 200)'[Calc item (Times 2)] = SELECTEDMEASURE() * 2
Você pode ver que o grupo de cálculo 1 tem um valor de precedência de 100 e o grupo de cálculo 2 tem um valor de precedência de 200.
Usando SQL Server Management Studio (SSMS) ou uma ferramenta externa com recursos de leitura/gravação XMLA, como o Editor tabular de código aberto, você pode usar scripts XMLA para criar grupos de cálculo e definir os valores de precedência. Aqui, adicionamos "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"
}
}
]
}
}
}
E esse script adiciona "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"
}
}
]
}
}
}
Em Power BI Desktop, temos um visual cartão mostrando a medida e uma segmentação de dados para cada um dos grupos de cálculo na exibição de relatório:
Quando ambas as segmentações são selecionadas, precisamos combinar as expressões DAX. Para fazer isso, começamos com o item de cálculo de precedência mais alto, 200, e, em seguida, substituímos o argumento SELECTEDMEASURE() pelo próximo maior, 100.
Portanto, nossa expressão DAX do item de cálculo de precedência mais alta é:
SELECTEDMEASURE() * 2
E nossa segunda expressão DAX do item de cálculo de precedência mais alta é:
SELECTEDMEASURE() + 2
Agora eles são combinados substituindo a parte SELECTEDMEASURE() do item de cálculo de precedência mais alta pelo próximo item de cálculo de precedência mais alta, desta forma:
( SELECTEDMEASURE() + 2 ) * 2
Em seguida, se houver mais itens de cálculo, continuaremos até chegarmos à medida subjacente. Há apenas dois grupos de cálculo nesse modelo, portanto, agora substituímos SELECTEDMEASURE() pela própria medida, desta forma:
( ( [Measure] ) + 2 ) * 2
Como nosso Measure = 10, isso é o mesmo que:
( ( 10 ) + 2 ) * 2
Quando não há mais argumentos SELECTEDMEASURE(), a expressão DAX combinada é avaliada:
( ( 10 ) + 2 ) * 2 = 24
Em Power BI Desktop, quando ambos os grupos de cálculo são aplicados com uma segmentação de dados, a saída da medida é semelhante a esta:
Mas tenha em mente que a combinação é aninhada de tal forma que a saída não será 10 + 2 * 2 = 14, como você vê aqui:
Para transformações simples, a avaliação é de precedência inferior a superior. Por exemplo, 10 tem 2 adicionados e, em seguida, é multiplicado por 2. No DAX, há funções como CALCULATE que aplicam filtros ou alterações de contexto a expressões internas. Nesse caso, a precedência superior altera uma expressão de precedência inferior.
Precedência também determina qual cadeia de caracteres de formato dinâmico é aplicada à expressão DAX combinada para cada medida. A cadeia de caracteres de formato dinâmico do grupo de cálculo de precedência mais alta é a única aplicada. Se uma medida em si tiver uma cadeia de caracteres de formato dinâmico, ela será considerada uma precedência inferior a qualquer grupo de cálculo no modelo.
Exemplo de precedência com médias
Vamos examinar outro exemplo usando o mesmo modelo, conforme mostrado no exemplo de inteligência de tempo descrito anteriormente neste artigo. Mas, desta vez, vamos também adicionar um grupo de cálculo Médias . O grupo de cálculo Médias contém cálculos médios que são independentes da inteligência de tempo tradicional, pois eles não alteram o contexto do filtro de data – eles apenas aplicam cálculos médios dentro dele.
Neste exemplo, um cálculo médio diário é definido. Cálculos como barris médios de petróleo por dia são comuns em aplicações de petróleo e gás. Outros exemplos de negócios comuns incluem a média de vendas da loja no varejo.
Embora esses cálculos sejam calculados independentemente dos cálculos de inteligência temporal, pode muito bem haver um requisito para combiná-los. Por exemplo, um usuário pode querer ver barris de petróleo por dia YTD para ver a taxa diária de petróleo do início do ano até a data atual. Nesse cenário, a precedência deve ser definida para itens de cálculo.
Nossas suposições são:
O nome da tabela é Médias.
O nome da coluna é Cálculo Médio.
A precedência é 10.
Itens de cálculo para Médias
Sem Média
SELECTEDMEASURE()
Média Diária
DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))
Aqui está um exemplo de uma consulta DAX e uma tabela de retorno:
Médias de consulta
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
)
Médias de retorno de consulta
A tabela a seguir mostra como os valores de março de 2012 são calculados.
Nome da coluna | Cálculo |
---|---|
YTD | Soma das vendas para janeiro, fevereiro de 2012 = 495.364 + 506.994 + 373.483 |
Média Diária | Vendas de março de 2012 divididas por # de dias em março = 373.483 / 31 |
Média Diária do YTD | YTD para Mar 2012 dividido por # de dias em janeiro, fevereiro e mar = 1.375.841 / (31 + 29 + 31) |
Aqui está a definição do item de cálculo YTD, aplicado com precedência de 20.
CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))
Aqui está a Média Diária, aplicada com uma precedência de 10.
DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))
Como a precedência do grupo de cálculo de Inteligência de Tempo é maior que a do grupo de cálculo Médias, ela é aplicada da forma mais ampla possível. O cálculo YTD Daily Average aplica YTD ao numerador e ao denominador (contagem de dias) do cálculo médio diário.
Isso é equivalente à seguinte expressão:
CALCULATE(DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate)), DATESYTD(DimDate[Date]))
Não esta expressão:
DIVIDE(CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date])), COUNTROWS(DimDate)))
Recursão lateral
No exemplo de Inteligência de Tempo acima, alguns dos itens de cálculo referem-se a outros no mesmo grupo de cálculo. Isso é chamado de recursão lateral. Por exemplo, YOY% faz referência a YOY e PY.
DIVIDE(
CALCULATE(
SELECTEDMEASURE(),
'Time Intelligence'[Time Calculation]="YOY"
),
CALCULATE(
SELECTEDMEASURE(),
'Time Intelligence'[Time Calculation]="PY"
)
)
Nesse caso, ambas as expressões são avaliadas separadamente porque estão usando instruções de cálculo diferentes. Não há suporte para outros tipos de recursão.
Item de cálculo único no contexto de filtro
Em nosso exemplo de Inteligência de Tempo, o item de cálculo do PY YTD tem uma única expressão de cálculo:
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR(DimDate[Date]),
'Time Intelligence'[Time Calculation] = "YTD"
)
O argumento YTD para a função CALCULATE() substitui o contexto de filtro para reutilizar a lógica já definida no item de cálculo YTD. Não é possível aplicar PY e YTD em uma única avaliação. Os grupos de cálculo só serão aplicados se um único item de cálculo do grupo de cálculo estiver no contexto de filtro.
Ordenando
Por padrão, quando uma coluna de um grupo de cálculo é colocada em um relatório, os itens de cálculo são ordenados em ordem alfabética por nome. A ordem em que os itens de cálculo aparecem em um relatório pode ser alterada especificando a propriedade Ordinal. Especificar a ordem do item de cálculo com a propriedade Ordinal não altera a precedência, a ordem na qual os itens de cálculo são avaliados. Ele também não altera a ordem na qual os itens de cálculo aparecem no modelo tabular Explorer.
Para especificar a propriedade ordinal para itens de cálculo, você deve adicionar uma segunda coluna ao grupo de cálculo. Ao contrário da coluna padrão em que Tipo de Dados é Texto, uma segunda coluna usada para ordenar itens de cálculo tem um tipo de dados Número Inteiro. A única finalidade dessa coluna é especificar a ordem numérica na qual os itens de cálculo no grupo de cálculo aparecem. Como essa coluna não fornece nenhum valor em um relatório, é melhor definir a propriedade Hidden como True.
Depois que uma segunda coluna for adicionada ao grupo de cálculo, você poderá especificar o valor da propriedade Ordinal para os itens de cálculo que deseja ordenar.
Para saber mais, confira Para ordenar itens de cálculo.
Criar um grupo de cálculo
Há suporte para grupos de cálculo no Visual Studio com projetos do Analysis Services VSIX atualização 2.9.2 e posterior. Os grupos de cálculo também podem ser criados usando a TMSL (Linguagem de Script de Modelo tabular) ou o Editor tabular código aberto.
Para criar um grupo de cálculo usando o Visual Studio
Em Explorer de Modelo de Tabela, clique com o botão direito do mouse em Grupos de Cálculo e clique em Novo Grupo de Cálculo. Por padrão, um novo grupo de cálculo tem uma única coluna e um único item de cálculo.
Use Propriedades para alterar o nome e insira uma descrição para o grupo de cálculo, a coluna e o item de cálculo padrão.
Para inserir uma expressão de fórmula DAX para o item de cálculo padrão, clique com o botão direito do mouse e clique em Editar Fórmula para abrir o DAX Editor. Insira uma expressão válida.
Para adicionar mais itens de cálculo, clique com o botão direito do mouse em Itens de Cálculo e clique em Novo Item de Cálculo.
Para ordenar itens de cálculo
Em Explorer modelo de tabela, clique com o botão direito do mouse em um grupo de cálculo e clique em Adicionar coluna.
Nomeie a coluna Ordinal (ou algo semelhante), insira uma descrição e defina a propriedade Hidden como True.
Para cada item de cálculo que você deseja ordenar, defina a propriedade Ordinal como um número positivo. Cada número é sequencial, por exemplo, um item de cálculo com uma propriedade Ordinal de 1 aparece primeiro, uma propriedade de 2 aparece em segundo e assim por diante. Os itens de cálculo com o padrão -1 não são incluídos na ordenação, mas aparecem antes dos itens ordenados em um relatório.
Limitações
Não há suporte para a OLS (segurança no nível do objeto) definida nas tabelas de grupo de cálculo. No entanto, o OLS pode ser definido em outras tabelas no mesmo modelo. Se um item de cálculo se referir a um objeto protegido por OLS, um erro genérico será retornado.
Não há suporte para RLS (segurança em nível de linha). Defina RLS em tabelas no mesmo modelo, mas não nos próprios grupos de cálculo (direta ou indiretamente).
Não há suporte para Expressão das Linhas de Detalhes com grupos de cálculo.
Narrativa inteligente visuais no Power BI não têm suporte com grupos de cálculo.
Não há suporte para agregações de coluna implícitas no Power BI para modelos com grupos de cálculo. Atualmente, se a propriedade DiscourageImplicitMeasures estiver definida como false (padrão), as opções de agregação aparecerão, no entanto, elas não poderão ser aplicadas. Se DiscourageImplicitMeasures estiver definido como true, as opções de agregação não aparecerão.
Ao criar relatórios do Power BI usando o LiveConnection, as cadeias de caracteres de formato dinâmico não são aplicadas a medidas no nível do relatório.