Saiba mais sobre a função CALCULATE
No final desta unidade, terá uma forte compreensão de como a função CALCULATE é uma das funções mais versáteis do Power BI.
A um nível elevado, tem controlo sobre o contexto de linha e filtro. Com a função CALCULATE, pode adicionar filtros, pode desligá-los e atualizá-los. É muito poder numa função!
Adicionar um filtro com CALCULATE
Em primeiro lugar, como adicionar um filtro com a função CALCULATE.
Tem o total de vendas na tabela de dados anterior:
Total Sales = SUM( [Sales Amount] )
Também tem uma versão filtrada do total de vendas, onde está a avaliar o total de vendas e a aplicar um contexto de filtro de avião:
Airplane Sales = CALCULATE( [Total Sales], 'Product Details'[ItemGroup] = "Airplane" )
Dica
CORRELACIONAR COM TABLEAU: O fragmento de código seguinte mostra como faria o mesmo cálculo em Tableau: Airplane Sales = IF [ItemGroup] = "Airplane" THEN SUM([Sales Amount] ELSE 0 END)
Ignorar um filtro com CALCULATE
Em seguida, como ignorar um filtro com a função CALCULATE.
Na tabela de dados anterior, tem o total de vendas por estado numa coluna e o total de vendas por toda a geografia na coluna seguinte. Esta coluna será útil quando quiser fazer análises sobre a percentagem do total de cada estado (ou linha).
A forma mais comum de fazer uma percentagem do total no DAX é através da função ALL.
Total Sales All Geo = CALCULATE( [Total Sales], ALL( Geography ) )
No código acima, está a olhar para a tabela Geografia e a incluir todos os valores na mesma; não reduza o contexto de filtro.
Dica
CORRELACIONAR COM TABLEAU: O fragmento de código seguinte mostra como faria o mesmo cálculo em Tableau, utilizando a expressão EXCLUDE LOD: Total Sales All Geo = { EXCLUDE [State], [City] : SUM([Total Sales]) }
Um exemplo de filtro ignorar diferente teria um aspeto semelhante ao seguinte:
Na tabela anterior, tem vendas totais por estado, total de vendas por toda a geografia (com todos os filtros geográficos excluídos) e, por fim, tem o total de vendas por todos os estados, mas com o filtro de cidade ainda a ser aplicado.
Com base na imagem, a cidade de Alexandria existe em vários estados. Então, você só quer encontrar o total de vendas desses estados que têm Alexandria como uma cidade:
Total Sales All States = CALCULATE( [Total Sales], ALL( Geography[State] ) )
Dica
CORRELACIONAR COM TABLEAU: é assim que faria o mesmo cálculo em Tableau, com a expressão EXCLUDE LOD. Irá reparar que esta expressão LOD é diferente da outra pela sua granularidade. Com esta expressão, só quer excluir o estado da vista, em vez do estado e da cidade: Total Sales All States = { EXCLUDE [State] : SUM([Total Sales]) }
Atualizar um filtro com CALCULATE
Por fim, as instruções finais para realçar a utilidade da função CALCULATE serão através da atualização de um filtro.
Na tabela de dados anterior, tem o total de vendas em geral (ignorando o ano), o total de vendas no contexto de filtro aplicado pela segmentação de dados no elemento visual e, em seguida, a última coluna é o total de vendas apenas para o ano de 2018.
Para obter a coluna "Vendas de 2018", terá de escrever algo assim:
2018 Sales = CALCULATE( [Total Sales], DATE[Year] = 2018 )
Dica
CORRELACIONAR COM TABLEAU: esta é interessante porque não parece haver uma comparação direta do Tableau. Para fazê-lo em Tableau, teria de duplicar campos, trazer origens de dados suplementares ou efetuar cálculos em cada coluna.
Vamos resumir o que reviu nesta unidade CALCULATE:
Qualquer expressão pode ser colocada como o primeiro argumento.
A expressão analisa todo o contexto de filtro na página (as segmentações de dados para a visualização).
Se os filtros estiverem presentes, será adicionado.
Se existir um filtro que já esteja na lista de filtros e for o mesmo que o contexto da página, substituirá esse filtro.
Depois de todas essas nuances (listadas acima), irá finalmente avaliar a expressão.
Nota
Obviamente, isto não é algo que deve fazer sem verificar as suas respostas para realmente compreender a ordem das operações. Devia perguntar a si mesmo: "Os meus filtros foram cancelados ou não?"