Capítulo
Capítulo
com
CAPÍTULO: 1
caioferreira2002@outlook.com
POWER BI
MÓDULO 2
Prezado(a) aluno(a), seja bem-vindo(a) ao treinamento de Power BI da DATAB. Você tomou uma das
decisões mais importantes em sua carreira: valorizar a análise de dados e estudar o principal software
que vai direcionar seus processos de exploração de dados.
É altamente recomendado que você faça download dos arquivos do curso (mencionados nas aulas
iniciais na plataforma da DATAB) e pratique juntamente conosco, dessa forma, seu aprendizado será
consolidado de diferentes formas: vendo, ouvindo, lendo, praticando e discutindo suas dúvidas.
Sempre que assistir uma aula, certifique-se que possa praticar com o Power BI aberto. Dessa forma,
dúvidas e erros surgirão e elas poderão ser explicadas logo abaixo de cada aula para que receba nosso
suporte e consiga concluir com sucesso os exercícios propostos.
Após aprender conceitos essenciais do Power BI com os assuntos do Módulo 1, você está preparado
para dar passos mais longos e explorar níveis de complexidade e volume maiores.
Com a base estruturada em seu aprendizado sobre como o Power Query e as outras funcionalidades
do Power BI se integram, nesse estágio você deve compreender corretamente o uso das etapas
de transformação e que a aplicação do Power Query deve ser predominantemente voltada para
tratamento de dados. Você também já deve ter solidificado em seu aprendizado que a parte analítica
de transformar dados em informação é realizada por meio de funções DAX e visualização em diversos
gráficos.
Depois da estruturação desses dois pilares: tratamento de dados e análise, aplicaremos os resultados
em visualizações com consistência para extrair ricas informações de cálculos para responder questões
de negócios. Seja bem-vindo(a) ao Power BI Módulo 2 da DATAB.
Um abraço,
caioferreira2002@outlook.com
Nenhuma parte desse material, sem autorização prévia por escrito dos autores, poderá ser
reproduzida ou transmitidas sejam quais forem os meios empregados: eletrônicos, mecânicos,
gravação, impresso ou quaisquer outros.
Caso tenha recebido esse material por distribuição livre, o que é proibido, entre em contato
com comercial@databinteligencia.com.br para denúncia.
Todas as marcas e imagens de hardware, software e outros utilizados e/ou mencionados nesta
DADOS DA PUBLICAÇÃO
www.databinteligencia.com.br
caioferreira2002@outlook.com
SUMÁRIO
CAPÍTULO 1: EXPLORANDO O ETL E A MODELAGEM DE DADOS......................................... 7
1.2 GRANULARIDADE.......................................................................................................................................11
AGRUPANDO VALORES......................................................................................................................................12
MESCLANDO TABELAS......................................................................................................................................19
MEMORIZANDO TABELAS................................................................................................................................ 22
1.4 TABELA CALENDÁRIO..................................................................................................................................30
CALENDARIO DINÂMICO................................................................................................................................. 30
CALENDÁRIO FISCAL..........................................................................................................................................32
COLUNA DATA.....................................................................................................................................................32
COLUNA MÊS...................................................................................................................................................... 36
COLUNA TRIMESTRE..........................................................................................................................................37
3.8 ACUMULADOS ............................................................................................................................................78
YEAR-TO-DATE.....................................................................................................................................................78
QUARTER E MONTH-TO-DATE..........................................................................................................................81
ACUMULADO MÓVEL........................................................................................................................................ 85
MÉDIA MÓVEL......................................................................................................................................................87
ENTENDENDO O PARÂMETRO....................................................................................................................... 90
APLICANDO EM UM GRÁFICO..........................................................................................................................91
caioferreira2002@outlook.com
3.10 RANKING....................................................................................................................................................93
CRITÉRIOS DE DESEMPATE............................................................................................................................... 98
CAPÍTULO
1
EXPLORANDO O ETL
Capítulo 1: EXPLORANDO O ETL E A
E A MODELAGEM
MODELAGEM DE DADOS
DE DADOS
Tratar e modelar os dados pode ser uma das tarefas mais árduas durante o desenvolvimento de um
projeto no Power BI. Isso se dá devido aos dados extraídos para elaboração dos relatórios serem
provenientes das mais diversas fontes e terem formas e estruturas diferentes. Por isso, tratá-los requer
aplicar as mais variadas técnicas. Mas manter os dados estruturados corretamente facilitam muito a
criação das métricas no Power BI. E por essa é uma tarefa essencial no desenvolvimento de projetos
de BI.
No módulo 1 aprendemos que o Power Query Editor é a ferramenta dentro do Power BI que facilita a
execução das tarefas de tratamento e transformação de dados. Um ponto muito importante em relação
ao Power Query Editor é que ele utiliza a linguagem M para escrever cada etapas de transformação que
aplicamos através dos botões e ícones que clicamos, e conhecer melhor essa linguagem nos abrirá um
leque de possibilidades além dos recursos disponíveis na interface gráfica do editor.
Neste capítulo faremos um contato maior com a linguagem M e com algumas situações recorrentes no
processo de ETL, e aprender como podemos utilizar a barra de fórmulas e o editor avançado a nosso
favor no processo de tratamento e modelagem no Power BI.
Para explorar melhor os recursos do Power Query Editor e da linguagem M vamos utilizar praticamente o
mesmo modelo que criamos no módulo 1, com a exceção que iremos importar uma nova tabela Metas.
caioferreira2002@outlook.com
Vamos utilizar o arquivo de Power BI disponibilizado nas primeiras aulas dessa sessão do Módulo 2.
Esse é o modelo já construído sem a tabela metas.
Abra o Power Query Editor para iniciarmos, clicando no menu Página Inicial → Transformar Dados.
Isso ocorreu porque o caminho base, que é onde estão salvos todos os arquivos que foram utilizados
neste modelo está apontando para um local que está no computador de quem criou o relatório este
Power BI. Para corrigir, basta clicar no parâmetro já criado com o nome CaminhoBase e informar o
caminho da pasta Dados no seu computador.
Os parâmetros são um tipo de consulta que contém um valor armazenado, que pode ser utilizado em
diversas outras situações durante a criação de uma consulta. No exemplo anterior, o parâmetro foi
utilizado para definir um caminho em comum que todas as consultas utilizam para apontar onde está
armazenado arquivo a ser conectado.
Para criar um parâmetro, no Power Query Editor clique em Página Inicial → Gerenciar Parâmetros →
Novo Parâmetro.
caioferreira2002@outlook.com
Na caixa de diálogo que será exibida, informe o nome do novo parâmetro, o tipo de dado e um valor
atual. No exemplo, o nome do parâmetro é Caminho Base, o tipo é Texto e o valor atual é o caminho
da pasta Dados.
Com o parâmetro criado, podemos utilizar o seu valor para compor o caminho de um arquivo, determinar
filtros em tabelas ou até criar colunas condicionais.
Clique em Página Inicial → Nova Fonte → Excel, importe o arquivo Metas.xlsx que está salvo na
pasta Dados e em seguida selecione a tabela Metas e clique no botão OK.
caioferreira2002@outlook.com
Esse processo é semelhante ao processo de conectar com qualquer fonte de dados que já realizamos
anteriormente. Mas agora vamos fazer uma adaptação no caminho do arquivo para utilizar o valor que
está armazenado no parâmetro CaminhoBase.
Na lista de etapas clique na engrenagem da etapa Fonte para alterar suas opções. Na caixa de diálogo
que será exibida marque a opção Avançadas. Em seguida, na primeira caixa de texto informe o
parâmetro CaminhoBase – para permitir a seleção do parâmetro é necessário alterar a opção ao lado da
caixa de texto. Na segunda caixa de texto digite \Metas.xlsx, conforme mostrado na imagem a seguir:
Clique em OK e a sua conexão com o arquivo metas está atrelado ao caminho definido no parâmetro.
Certifique-se de clicar na última etapa da consulta para visualizar os dados.
1.2 GRANULARIDADE
A granularidade é uma das mais importantes definições na modelagem de dados e requer muita
atenção. Um grão informacional é o menor nível de detalhamento da informação e é definido
conforme as necessidades apuradas na fase de levantamento de requisitos do projeto. A granularidade
é determinada para cada tabela fato, já que normalmente essas tabelas possuem informações e
granularidades diferentes.
Existe uma relação entre o detalhamento das informações e a granularidade de uma tabela. Quanto
menor a granularidade isso significa que maior será o detalhamento dos dados, e por consequência
maior o volume de dados, também. E quanto maior a granularidade, menor será o detalhamento
e menor o volume de dados. Podemos notar então que, a granularidade e o detalhamento são
inversamente proporcionais.
caioferreira2002@outlook.com
É a definição do tamanho do grão que nos permitirá a execução das ações conhecidas como drill down
e roll up (drill up). Essas são operações que estão relacionadas com a sumarização e o detalhamento
dos grãos. Através do drill down diminuímos o nível de granularidade e aumentamos os detalhes. Já
com o roll up fazemos o processo oposto, aumentando o nível de granularidade e diminuindo o nível
de detalhamento das informações.
Conclui-se que deve ser analisado o equilíbrio entre detalhamento e performance para que a
granularidade seja modelada com a melhor eficiência e eficácia para as consultas dos usuários, sempre
levando em consideração as necessidades levantadas no começo do projeto. De nada adianta deixar a
granularidade alta sem que seja alcançado o grão exigido pelo negócio.
AGRUPANDO VALORES
Na tabela Metas que importamos no exemplo anterior temos uma coluna denominada Canal onde está
estipulado qual é canal de vendas daquela meta.
Se analisarmos um pouco mais a fundo, na outra tabela fato presente – Vendas, não temos essa
granularidade dos dados. Isso indica que até é possível filtrar as metas pelo canal de vendas, mas não
será possível filtrar as vendas, impedindo essa comparação entre os dois fatos.
Por essa razão, vamos aumentar o tamanho do grão da tabela Metas, agrupando as informações pelas
de maneira que a informação da coluna Canal seja removida, sem perder a referência dos valores.
Para agrupar valores no Power Query Editor clique em Página Inicial → Agrupar por. Na caixa de
diálogo que será exibida vamos determinar os agrupamentos e as agregações.
Os agrupamentos são as colunas que desejamos agrupar, de forma que no resultado não haja
repetições formadas pelo conjunto das colunas. Informe as colunas Data Meta, Cod.Unidade, Cod.
Produto e Rev. Para isso é necessário clicar na opção Avançadas.
caioferreira2002@outlook.com
As agregações são as novas colunas geradas a partir do agrupamento. Neste caso queremos que os
valores na coluna Vl.Total sejam somados, retornando uma nova coluna de mesmo nome.
Digite Vl.Total no campo nome da nova coluna, em operação selecione Soma e em coluna selecione
a coluna Vl.Total.
Um cuidado muito importante que tomamos foi não agrupar dados de revisões diferentes
armazenados na coluna Rev, que indica o histórico de alteração das metas. Isso demonstra que nesta
tabela pode haver “versões diferentes” para uma mesma meta. Se não levarmos essa informação
em consideração os valores de todas as revisões seriam somados gerados dados completamente
errôneos.
O próximo passo agora é manter apenas as metas da versão mais recente. Precisamos filtrar apenas a
última versão de cada meta, e faremos isso com um novo agrupamento de dados.
Clique novamente em Página Inicial → Agrupar por. Agora vamos fazer um agrupamento sem
agregados os dados. Clique na opção avançadas e informe as colunas Data Meta, Cod.Unidade e
Cod.Produto no agrupamento.
caioferreira2002@outlook.com
Como não vamos agregar as informações dessa vez, na agregação digite Dados para o nome da nova
coluna, e em operação selecione todas as linhas. Clique em OK.
O resultado será uma tabela contendo as três colunas agrupadas, e um coluna chamada dados contendo
outra tabela. Se você clicar ao lado da palavra Table em cada célula será possível visualizar o conteúdo
da tabela. Perceba que é exibido exatamente cada uma das revisões para cada linha da meta.
Nosso objetivo agora é extrair apenas a meta da revisão com maior número.
caioferreira2002@outlook.com
Para extrair apenas o maior registro da tabela presente na coluna Dados vamos utilizar uma função da
linguagem M chamada Table.Max que retorna a maior linha da tabela usando uma de suas colunas
como critério de comparação.
Para isso, vamos criar uma coluna personalizada onde a fórmula será inserida. Clique em Adicionar
Coluna → Coluna Personalizada. Atribua o nome Registro para a nova coluna, e insira a fórmula a seguir:
= Table.Max([Dados], “Rev.”)
A nova coluna criada extrairá o registro que contém o maior valor na coluna Rev. presente em cada uma
das tabelas na coluna Dados.
Perceba que no registro retornado pela função Table.Max, já temos todas as informações que
precisamos. Então podemos manter apenas a coluna registro nesta tabela.
Clique com o botão direto sobre o cabeçalho da coluna Registro e escolha a opção Remover Outras Colunas.
caioferreira2002@outlook.com
Em seguida expanda os valores da coluna registro. Como não precisaremos da informação da coluna
Rev. você pode desmarcar essa informação. Lembre-se também de não usar o nome da coluna original
como prefixo.
E por fim, selecione todas as colunas da tabela e clique em Transformar → Detectar Tipo de Dados.
A função Table.Max é só um exemplo das mais de 600 funções disponíveis na linguagem M que
poderão facilitar o seu processo de tratamento de dados no Power Query Editor.
Se quiser conhecer mais sobre cada uma das funções da linguagem M acesse a documentação oficial
no site da Microsoft no link https://docs.microsoft.com/pt-br/powerquery-m/power-query-m-function-
reference. Todas as funções estão listadas e divididas em 24 categorias facilitando a consulta e o
aprendizado.
Mas não se preocupe, você não precisa aprender todas de uma vez. O processo de aprendizado da
linguagem M é como o processo de aprendizado de um novo idioma. Muitas das funções (ou palavras)
que você aprender vai ser a medida que avança no estudo e na aplicação. Neste curso ainda vamos
aplicar mais algumas funções.
caioferreira2002@outlook.com
O ideal é que cada meta tivesse sida definida também para cada vendedor, para possibilitar essa
comparação. Como não temos essa informação neste nível de granularidade, uma estratégia possível
é ratear o valor das metas para cada um dos vendedores.
Um cuidado importante é ratear as metas pelo número correto de vendedores em cada período, pois
os vendedores ativos variam ao longo do tempo.
Para isso, é necessário saber quais os vendedores estavam ativos em cada mês. Vamos duplicar a
tabela Vendas para gerar uma lista de vendedores por mês.
caioferreira2002@outlook.com
Renomeie a nova tabela gerada para AuxVendedorMes. Como essa será uma tabela auxiliar, não é
necessário que ela seja carregada para o Power BI. Clique com o botão direito na tabela e deixe a
opção Habilitar Carga desabilitada.
Para obter os vendedores ativos em cada mês, precisamos apenas das colunas Data Pedido e Cod.
Vendedor. Então selecione as essas colunas e em seguida remova as outras colunas.
A tabela Vendas possui uma granularidade de data diária, enquanto a tabela metas possui uma
granularidade mensal. Para isso, vamos transformar todas as datas de pedidos para o primeiro dia de
cada mês, para equivaler as granularidades.
Selecione a coluna Data Pedido, e clique em Transformar → Data → Mês → Início do Mês.
Como um mesmo vendedor pode efetuar várias vendas em um mesmo mês, vamos remover as
duplicidades para que tenhamos apenas uma linha para cada vendedor em cada mês.
caioferreira2002@outlook.com
Selecione as duas colunas e clique em Página Inicial → Remover Linhas → Remover Duplicatas.
Pronto! Agora já temos a relação de todos os vendedores ativos em cada um dos meses. O próximo
passo será vincular essa informação com a tabela Metas.
MESCLANDO TABELAS
Cruzar dados entre tabelas é muito comum durante o processo de tratamento e modelagem dos
dados. Quando precisamos trazer informação de uma tabela para outra tabela no Power Query Editor
utilizamos o recurso Mesclar Consultas.
Para fazer o rateio é necessário trazer os dados de vendedores ativos da tabela AuxVendedorMes
para a tabela Metas. Clique na tabela Metas no painel de consultas a esquerda e depois no menu
Página Inicial → Mesclar Consultas.
Na caixa de diálogo que é exibida temos que informar quais campos as tabelas têm em comum.
Precisamos então relacionar o campo Data Meta da tabela Metas com Data Pedido da tabela
AuxVendedorMes. Para isso, selecione a tabela AuxVendedorMes na caixa de opções, e depois clique
sobre o nome dos campos.
caioferreira2002@outlook.com
O Power Query Editor irá fazer um cálculo de correspondências entre as duas tabelas, verificando
quantos registros presentes na primeira tabela possuem correspondências na segunda tabela. Esse
cálculo pode demorar um pouco dependendo do volume de dados nas duas tabelas.
Para esse exemplo, podemos perceber que foram encontradas correspondências para todas as 2174
linhas presentes na tabela Metas.
Uma opção importante presente nesta caixa de diálogo é o Tipo de Junção. Essa configuração é
essencial para correta mesclagem dos valores. Existem 6 tipos de junção diferentes e elas denominam
a primeira tabela como esquerda e a segunda como direita:
Para este exercício, vamos deixar a opção externa esquerda habilitada, pois queremos manter todas
as linhas de metas. Clique em OK para finalizar.
O resultado será uma nova coluna chamada AuxVendedoresMes contendo tabelas com os
vendedores ativos para cada linha de meta.
caioferreira2002@outlook.com
Com as tabelas de vendedores ativos em cada mês obtidas, vamos criar uma coluna que retorne o
valor da quantidade de vendedores, contando quantas linhas cada tabela retornada possui. Para isso
adicionaremos uma coluna personalizada usando a função Table.RowCount para realizar a contagem
de linhas. Clique em Adicionar Coluna → Coluna Personalizada e adicione a fórmula a seguir:
= Table.RowCount([AuxVendedorMes])
MEMORIZANDO TABELAS
Depois de aguardar algum tempo, provavelmente você notará que o Power Query Editor está
demorando mais que o normal para carregar os dados. É possível observar na barra de status o
volume das informações sendo carregadas enquanto algumas bolinhas animam a tela mostrando que
os dados ainda estão sendo processados.
O primeiro indício de que há algo errado é o volume de informações sendo carregadas. Na imagem
a anterior é possível notar que já haviam sido carregadas mais de 1,2 gigabytes de dados do arquivo
vendas.xls enquanto o arquivo vendas.xlsx possui pouco menos de 32 megabytes de tamanho. Isso
acontece, pois, para avaliar o resultado da função Table.RowCount, o Power Query recorre a tabela
AuxVendedorMes, que por sua vez recorre ao arquivo vendas.xlsx, fazendo que seja recarregado
sempre que um novo cálculo é avaliado.
Como a fórmula é avaliada para cada linha da tabela Metas, o arquivo vendas.xlsx seria carregado
8398 vezes (número de linhas da tabela). E isso poderia variar conforme a tabela metas tivesse o
número de linhas alterado.
Na consulta que estamos criando, nós instanciamos a tabela AuxVendedorMes na etapa anterior –
Consultas Mescladas. Clique sobre o nome desta etapa no painel config. consulta.
Na barra de fórmulas é possível visualizar a fórmula da linguagem M que fez a mesclagem das tabelas
utilizando a função Table.NestedJoin. Se a barra de fórmulas estiver oculta, clique em Exibição →
Barra de Fórmulas.
Após editar a fórmula, pressione enter e aguarde o carregamento dos dados. O arquivo vendas.xlsx
começará a ser carregado novamente, porém desta vez apenas uma vez, fazendo com que o processo
termine assim que atingir o seu tamanho de aproximadamente 32 megabytes.
Volte para a etapa Personalização Adicionada1 e verifique se a coluna Qtde que criamos foi
calculada corretamente.
caioferreira2002@outlook.com
As colunas personalizadas permitem não só apenas fórmulas com funções, mas é possível criar
cálculos com expressões matemáticas como multiplicações, divisões, adições ou qualquer outra
expressão. Vamos adicionar uma nova coluna dividindo o valor da coluna Vl.Total pela coluna
Qtde. Clique em Adicionar Coluna Coluna Personalizada e digite a fórmula com a expressão
matemática dividindo as duas colunas.
= [Vl.Total] / [Qtde]
Com os valores de rateio das metas calculados para cada um dos vendedores, agora é só expandir a
coluna AuxVendedorMes trazendo o Cod.Vendedor replicando as informações para cada um dos
vendedores dentro da tabela.
As divisões são exatas e podem resultar em valores com muitas casas decimais. Não há nenhum
problema em trabalhar com os valores com muitas casas decimais pois podemos formatar a exibição
dos valores na visualização de dados.
É possível também arredondar os valores no Power Query, mas é importante ter em mente
que as transformações realizadas através do editor de consultas transformam os dados, e um
arredondamento eliminaria a precisão dos valores, acarretando pequenas diferença nos valores
agregados.
Se ainda assim preferir proceder com o arredondamento, selecione a coluna Vl.Meta e clique em
Transformar → Arredondamento → Arredondar e informe o número de casas desejadas.
caioferreira2002@outlook.com
Por fim, podemos remover as colunas Vl.Total e Qtde que não são mais necessárias na tabela e
teremos a tabela a seguir como resultado. Clique em Página Inicial → Fechar e Aplicar.
• Metas[Cod.Vendedor] Vendedores[Cod.Vendedor]
• Metas[Cod.Produto]Produtos[Cod.Produto]
• Metas[Cod.Unidade]Unidades[Cod.Unidade]
caioferreira2002@outlook.com
Dica: Para evitar que meses vazios apareçam com percentual ne-
gativo no gráfico, utilizamos a função condicional IF para calcular
o percentual apenas quando a medida [Soma Vendas] for maior
que zero.
caioferreira2002@outlook.com
Com as medidas criadas, vamos inseri-las em dois visuais dos tipos gráfico de área e gráfico de
colunas clusterizado, conforme os esquemas abaixo:
Campos:
• Valores: [% Metas]
Formato:
• Eixo Y: desativado
• Formas
o Largura do traço: 4
o Tamanho do marcador: 6
• Título: desativado
Formato:
• Eixo Y: desativado
• Título: desativado
1.4 TABELA CALENDÁRIO
CALENDARIO DINÂMICO
No módulo 1 aprendemos a criar uma tabela calendário usando uma consulta em branco através do
código da linguagem M. Porém, a tabela criada é estática, pois digitamos exatamente as datas inicial
e final para gerar a tabela.
O grande problema dessa prática é que à medida que os dados da tabela Vendas forem sendo
atualizados, o período pode ficar defasado. O ideal é que consigamos buscar o período da tabela
Vendas para gerar a tabela calendário dinamicamente.
O código que utilizamos no módulo 1 para gerar a lista de datas da tabela calendário foi o seguinte:
let
DataInicial = #date(2016, 01, 01),
DataFinal = #date(2020, 12, 31),
QtdeDias = Duration.Days(DataFinal - DataInicial) + 1,
Lista = List.Dates(DataInicial, QtdeDias, #duration(1,0,0,0)),
in
Lista
Abra o Power Query Editor clicando em Página Inicial → Transformar Dados, em seguida selecione
a tabela Calendario, e depois clique em Página Inicial → Editor Avançado para visualizar o código
completo da tabela gerada.
O objetivo é buscar a menor e a maior data existente na coluna Data Pedido da tabela Vendas,
usando-as como valores para gerar a tabela calendário. Para isso vamos criar uma lista contendo
todas as datas na coluna Data Pedido e em seguida utilizar as funções List.Min e List.Max para
retornar o menor e o maior valor dessa lista, respectivamente.
Com a tabela Calendário aberta no editor avançado, vamos adicionar uma etapa para retornar a lista
de datas logo após a instrução let.
Com a lista de datas criada, vamos utilizá-la para buscar o maior e menor valor da lista usando as
funções List.Min e List.Max. Altere os códigos das etapas DataInicial e DataFinal, de acordo
com o código a seguir:
DataInicial = List.Min(ListaDatas),
DataFinal = List.Max(ListaDatas),
Clique em Concluído para finalizar a edição do código. Agora a tabela Calendario é gerada
dinamicamente conforme a menor e maior data tabela Vendas.
É recomendável que a tabela calendário abranja períodos completos, evitando começar no meio
de um mês, ou até mesmo do ano. Garantir que os períodos estejam completos pode evitar que as
funções de inteligência temporal do DAX retornem valores incorretos.
Na base de dados atual, a primeira venda foi realizada no dia 25/06/2016, fazendo com que o
calendário se inicie no mesmo dia, e o ideal é que o data inicial do calendário fosse o primeiro dia do
ano – 01/01/2016. Podemos obter esse resultado usando uma função da linguagem M que retorna o
primeiro dia o ano de uma data – Date.StartOfYear.
Abra mais uma vez o editor avançado no menu página inicial, e altere a fórmula da etapa DataInicial.
DataInicial = Date.StartOfYear(List.Min(ListaDatas)),
De forma semelhante, podemos utilizar a função Date.EndOfYear para retornar o último dia do ano.
DataFinal = Date.EndOfYear(List.Max(ListaDatas)),
Com as alterações feitas é garantido que a tabela calendário sempre iniciar-se-á no primeiro dia do
ano e terminar-se-á no último dia do ano da menor e da maior data de vendas, respectivamente.
caioferreira2002@outlook.com
Segue uma lista de algumas funções da categoria Datas que podem ser muito úteis.
CALENDÁRIO FISCAL
Na grande maioria das empresas todo ano o alto escalão se reúne (ou pelo menos deveria fazer isso)
para analisar o que ocorreu no ano que se passou e planejar quais serão as metas para o ano seguinte
dentro de determinado prazo.
Esse prazo pode ser de janeiro a dezembro, abril a março ou até de julho a junho. A data inicial
em si não importa, sendo mais importante a sua duração. Esse prazo de um ano é conhecido na
contabilidade como ano fiscal.
No Power BI também é possível analisar e comparar dados através dos anos fiscais. Para isso,
devemos criar uma tabela específica de Calendário Fiscal que contemple os períodos desejados.
Primeiro, certifique-se que esteja no Power Query Editor. Caso já tenha fechado o editor, clique
em Página Inicial → Transformar Dados. Com o editor aberto, vamos criar uma nova consulta em
branco clicando em Página Inicial → Nova Fonte → Consulta Nula e renomeie a consulta para
CalendarioFiscal.
COLUNA DATA
Para a criação da tabela de calendário fiscal vamos utilizar o mesmo período que abrange a tabela de
calendário civil, que já temos no modelo. Então, para gerar a coluna de datas não é necessário repetir
todo o processo da primeira tabela. Vamos apenas utilizar uma função que selecione uma coluna que
já existe em outra tabela e traga para a consulta atual. Essa função é a Table.SelectColumns.
Com a consulta CalendarioFiscal selecionada vamos digitar a fórmula abaixo. Caso a barra de
fórmulas esteja desabilitada no seu editor, habilite-a em Exibição → Barra de Fórmulas.
= Table.SelectColumns(Calendario, “Data”)
Após digitar a fórmula e pressionar enter, o resultado deve ser uma coluna idêntica a coluna Data que
já temos na tabela calendário. O próximo passo agora é adicionar as novas colunas.
caioferreira2002@outlook.com
Como citado anteriormente, os períodos fiscais podem ser diferentes de uma empresa para outra.
Para o nosso exemplo, vamos tomar como definição que o ano fiscal começa no dia 01/07. Isso
significa que julho será o mês 1, agosto o mês 2 e assim por diante, criando uma defasagem de 6
meses em relação ao calendário civil.
Para facilitar a criação das colunas extras da nova tabela calendário, vamos criar uma coluna auxiliar
que retornará uma data equivalente da data civil para a data fiscal. Por exemplo: a data 1º de janeiro
(01/01) é equivalente ao 1º dia do sétimo mês (01/07) no calendário fiscal.
O que temos que fazer é subtrair 6 meses da data atual, para obter a nova data. E para isso vamos
utilizar a função Date.AddMonths adicionando uma coluna personalizada. Clique em Adicionar
Coluna → Coluna Personalizada e atribua o nome Data Fiscal à nova coluna, e digite a fórmula a
seguir:
= Date.AddMonths([Data], -6)
A função Date.AddMonths possui dois argumentos – o primeiro é a data à qual queremos adicionar
os meses, e o segundo é o número de meses que serão adicionados. O segundo argumento pode
receber um valor negativo quando se desejar subtrair meses da data.
Como os anos fiscais não iniciam em janeiro e terminam em dezembro, normalmente eles têm uma
nomenclatura específica para identificar o ano que se iniciou e terminou o ciclo. Não existe uma regra
específica, e cada empresa pode adotar uma nomenclatura diferente. Para esse exemplo vamos
utilizar o padrão com os anos inicial e final separados por uma barra.
Por exemplo, a data 08/09/2017 faz parte do ano fiscal que se iniciou em 01/07/2017 e terminou em
30/06/2018. Por isso, falaremos que pertence ao ciclo 2017/2018. Já a data 03/02/2019 faz parte do
ano fiscal que se iniciou em 01/07/2018 e terminou em 30/06/2019. Desta maneira, falaremos que
pertence ao ciclo 2018/2019.
Com a regra definida, vamos criar uma coluna personalizada com o nome Ano Fiscal que retorne os
valores desejados. Clique em Adicionar Coluna → Coluna Personalizada.
= let
ano1 = Date.Year([Data Fiscal]),
ano2 = ano1 + 1,
anofiscal = Text.From(ano1) & “/” & Text.From(ano2)
in
anofiscal
Como podemos perceber é possível criar colunas personalizadas utilizando a estrutura let..in da
linguagem M. Essa semântica facilita a divisão de um cálculo em subetapas. A regra é criar cada
fórmula após a instrução let, separando-as por vírgulas, e para finalizar, após a instrução in retornar o
nome da etapa final que será o resultado do cálculo.
Na etapa ano1 utilizamos a função Date.Year para extrair apenas o valor numérico do ano da
coluna Data Fiscal.
ano2 = ano1 + 1,
Com o valor do ano inicial extraído, na etapa ano2 adicionamos 1 ao valor calculado anteriormente.
A etapa anofiscal é a junção dos valores ano1, uma barra e ano2 utilizando o operador de
concatenação (& comercial). É importante notar que para realizar a junção de textos, todos os
valores devem ser do tipo texto. Como os valores obtidos nas etapas ano1 e ano2 são numéricos, foi
utilizada a função Text.From para fazer a conversão para dos números para texto.
in
anofiscal
Por fim, após o bloco in definimos que o resultado retornado do cálculo será o obtido na etapa anofiscal.
A próxima coluna que será adicionada é o nome do mês. Os nomes dos meses serão extraídos da
coluna Data e não da Data Fiscal, visto que os nomes dos meses não mudam em um ano fiscal,
apenas a sua ordenação.
Para isso, selecione a coluna Data e depois clique em Adicionar Coluna → Data → Mês → Nome
do Mês. Uma outra alternativa seria utilizar a função Date.MonthName adicionando uma coluna
personalizada.
= Date.MonthName([Data])
caioferreira2002@outlook.com
COLUNA MÊS
A coluna com o número do mês é útil para classificar os nomes dos meses nas visualizações no Power
BI. Porém, no calendário fiscal devemos fazer uma adaptação, tendo em vista que os meses iniciam a
contagem a partir do mês de julho (no caso do nosso exemplo).
Sendo assim, vamos utilizar a coluna Data Fiscal, que criamos anteriormente, para extrair o número do
mês. Selecione a coluna Data Fiscal e em seguida clique em Adicionar Coluna → Data → Mês → Mês.
De forma semelhante, outra alternativa seria utilizar a função Date.Month através de uma coluna
personalizada.
= Date.Month([Data Fiscal])
caioferreira2002@outlook.com
COLUNA TRIMESTRE
De forma semelhante aos meses, temos que levar em consideração que os trimestres também iniciam
a contagem a partir de julho ao adicionar a coluna trimestre. Sendo assim, mais uma vez vamos utilizar
a coluna Data Fiscal para extrair o número do trimestre. Selecione a coluna Data Fiscal e em seguida
clique em Adicionar Coluna → Data → Trimestre → Trimestre do Ano.
Se preferir, podemos adicionar a letra “T” antes do número do trimestre. Selecione a coluna Trimestre
que acabamos de criar e em seguida clique no menu Transformar → Formato → Adicionar Prefixo,
informe a letra “T” na caixa de texto exibida e clique em OK.
É possível também obter o mesmo resultado através da coluna personalizada com a seguinte fórmula:
A coluna Data Fiscal foi criada para facilitar a adição dos cálculos do Ano Fiscal, Mês e Trimestre, mas
não é necessária no modelo final. Sendo assim vamos removê-la da tabela.
Clique com o botão direito sobre o nome da coluna Data Fiscal no cabeçalho da tabela e clique na
opção Remover.
Não podemos esquecer de determinar o tipo de dado das colunas. Selecione todas as colunas e
clique em Transformar → Detectar Tipo de Dados.
Pronto, a tabela CalendarioFiscal está finalizada. Para carregá-la no Power BI clique em Página
Inicial → Fechar e Aplicar.
Com a nova tabela CalendarioFiscal adicionada ao modelo, precisamos relacioná-la com as demais.
Se analisarmos os relacionamentos da tabela Calendario, é possível perceber que esta possui
relacionamento diretos com as tabelas fatos Metas e Vendas.
Uma saída seria criar os mesmos relacionamentos entre as tabelas fatos e a tabela CalendarioFiscal.
Nesta situação, dois novos relacionamentos seriam adicionados ao modelo, um para cada tabela fato.
Porém há uma alternativa melhor. A tabela CalendarioFiscal é uma extensão da tabela Calendario,
pois possuem as mesmas chaves primárias. Para cada valor em uma tabela, temos uma linha
correspondendo na outra tabela com a mesma chave. Isso nos permite faze um relacionamento direto
entre as tabelas calendários através das suas chaves primárias. Crie a relação, arrastando o campo
Data da tabela CalendarioFiscal para cima do campo Data da tabela Calendario.
Uma relação um para um será criada com direção bidirecional. Isso permitirá que sempre que a tabela
CalendarioFiscal sofrer um filtro, o filtro se propague para a tabela Calendário e na sequência se
propague para todas as tabelas Fatos relacionadas à essa tabela.
A relação bidirecional também garantirá que todos os filtros aplicados na tabela Calendario se
propaguem para a tabela CalendarioFiscal e vice-versa.
Nesta situação não há problema em utilizar a relação bidirecional pois as tabelas possuem relação
direta através das suas chaves primárias.
caioferreira2002@outlook.com
Formato:
• Eixo X: ativado, na Cor: branca, com Concatenar rótulos: desativado, com Título:
desativado e Linhas de grade: ativado
• Título: desativado
VISUAL 2 – MATRIZ
Campos:
Formato:
• Título: desativado
VISUAL 3 – MATRIZ
Campos:
Formato:
• Cabeçalhos da coluna, com Cor da fonte: branca e Cor da tela de fundo: #230948
• Cabeçalhos da linha, com Cor da fonte: #230948, Cor da tela de fundo: branca,
Ícones +/-: ativado, Cor do ícone: #230948 e Tamanho do ícone: 9pt
• Valores, com Cor da tela de fundo: branca, Alternar cor da tela de fundo:
#DCD5E6 e Estilo de linha em tiras: ativado
• Título: desativado
Resultado esperado:
caioferreira2002@outlook.com
API – em inglês, Application Programming Interface – é uma forma de integrar sistemas e funcionam
como uma espécie de “ponte” que conectam diferentes aplicações, podendo ser utilizadas para
os mais variados tipos de negócio e em diferentes interfaces. Uma das interfaces das APIs são as
consultas de dados oferecidos por outras aplicações.
No nosso exemplo, vamos utilizar uma API pública oferecida pelo Banco Central do Brasil (BCB)
para consultar as cotações históricas do dólar, para aplicá-las na conversão dos valores de vendas no
nosso modelo. Cada API possui as suas particularidades e normalmente oferece uma documentação
completa sobre o seu uso, detalhando parâmetros, resultados e suas limitações.
A API que iremos utilizar possui uma interface web que está disponível no link https://olinda.bcb.
gov.br/olinda/servico/PTAX/versao/v1/aplicacao#!/recursos/CotacaoDolarPeriodo, onde é possível
simular uma consulta e copiar a URL que retornará os dados para os parâmetros simulados. Será essa
URL que iremos utilizar para conectar aos dados no Power BI.
De volta ao Power BI, vamos utilizar o conector Web para trazer as informações fornecidos pela API.
Clique em Página Inicial → Obter Dados → Web, cole a URL que copiou do site da API na caixa de
texto e clique em OK.
O Power Query Editor será aberto e uma nova consulta será criada. Renomeie a consulta para
CotacaoDolar.
O resultado obtido da consulta à API foi um registro conteúdo duas informações – @data.context e
value. O primeiro valor é apenas a URL que utilizamos para conectar, enquanto a segunda informação
é uma lista de valores, que é justamente o que estamos procurando. Clique sobre o link com a palavra
List para obter os dados da lista.
Agora podemos visualizar uma lista contendo vários registros. Cada registro desse é a cotação de
uma data. Para visualizar o conteúdo do registro, clique na parte em branco ao lado da palavra
Record (não clique em cima da palavre record).
caioferreira2002@outlook.com
Para expandir todos os registros, precisamos converter a lista em uma tabela. No faixa de opções
clique em Ferramentas de Lista Transformar Para a Tabela, e em seguida clique em OK já
caixa de diálogo que será exibida.
Com a lista convertida em tabela, é possível expandir todas as colunas dos registros. Clique no
ícone com duas setas no cabeçalho da coluna e selecione todas as colunas que deseja expandir.
Desmarque a opção para usar o nome da coluna original como prefixo e clique em Ok.
Agora temos uma tabela com as cotações de compra e venda do dólar, além da data e hora da
cotação. Próximo passo é classificar os tipos de dados das colunas. Vamos começar pela coluna
dataHoraCotacao.
caioferreira2002@outlook.com
Precisamos apenas da referência da data de cotação, então vamos tentar converter os dados da
coluna para o tipo Data. Clique no ícone ABC123 ao lado no nome da coluna e escolha o tipo Data.
A resultado da operação foi vários erros gerados. Isso ocorreu pois o Power Query não conseguiu
converter os valores que estão no formato de data/hora diretamente para data. Para corrigir essa situação,
primeiro teremos que fazer a conversão para data/hora e em seguida fazer a conversão para data.
Clique no novamente no ícone do formato e escolha a opção Data/Hora. Perceba que como há
havíamos feito uma alteração de tipo nesta coluna imediatamente anterior a essa alteração, o
Power Query nos solicita se desejamos apenas substituir a alteração atual, ou criar uma nova etapa
mantendo a alteração anterior, e em seguida fazendo uma nova transformação.
Clique em Substituir Atual para substituir a alteração anterior por essa nova alteração que estamos
solicitando.
Com o tipo da coluna definido como data/hora, vamos alterar o tipo novamente definindo agora
como data. Novamente será perguntado se desejamos substituir a alteração anterior. Agora vamos
alterar o tipo mantendo a alteração anterior. Clique em Adicionar nova etapa.
caioferreira2002@outlook.com
Para finalizar, defina os tipos de dados das colunas cotacaoCompra e cotacaoVenda para número decimal.
Na barra de fórmulas é possível perceber que o resultado da tabela retornou apenas 100 linhas,
quando era esperando todas as cotações entre janeiro/2016 e dezembro/2020.
Isso ocorreu devido a um parâmetro de limitação de linhas que passamos juntamente da URL ao
conectarmos à API. Vamos da ruma analisada na URL que conectamos.
https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolar-
Periodo(dataInicial=@dataInicial,dataFinalCotacao=@dataFinalCotacao)?@da-
taInicial=’01-01-2016’&@dataFinalCotacao=’12-31-2020’&$top=100&$format=json
Nota-se que os parâmetros de consulta foram informados na própria URL da conexão – dataInicial,
dataFinalCotacao, top e format. E foi justamente o parâmetro top que limitou a quantidade total de
registros retornados pela API. Você pode remover esse parâmetro da URL para que não haja limitação
de linhas no resultado.
caioferreira2002@outlook.com
Agora remova a parte &$top=100 (destacada na imagem) da URL. Essa deve ser a URL final:
https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDo-
larPeriodo(dataInicial=@dataInicial,dataFinalCotacao=@dataFinalCotacao)?@
dataInicial=’01-01-2016’&@dataFinalCotacao=’12-31-2020’&$format=json
Clique em OK para aplicar a mudança. Selecione a última etapa da consulta para visualizar o
resultado. Agora é possível notar que o resultado retornou mais de 999 linhas, como esperado.
caioferreira2002@outlook.com
Como a informação que estamos importando está diretamente ligada ao calendário, não é necessário
importar mais uma tabela o Power BI. Podemos atrelar a cotação do dólar de cada data, com as datas
da tabela calendário evitando mais uma relação e mais uma tabela no modelo. Isso também nos
permitirá replicar as cotações do último dia útil para as datas que não existe cotação. Vamos utilizar
um recurso que já aprendemos para fazer isso – Mesclar Consultas.
Primeiro selecione a tabela Calendario no painel de consultas, e depois clique em Página Inicial →
Mesclar Consultas. Selecione a tabela CotacaoDolar para mesclar, e em seguida indique as colunas
Data e dataHoraCotacao como chave entre as tabelas. Mantenha o tipo de junção como externa
esquerda. Por último, clique em OK.
Com as tabelas mescladas, vamos expandir as informações que desejamos obter. Clique nas duas
setas próximo ao cabeçalho da coluna gerada e escolha os campos cotacaoCompra e cotacaoVenda.
Lembre-se também de desmarcar a opção para usar o nome da coluna original como prefixo.
caioferreira2002@outlook.com
Os dados de cotação do dólar somente possuem informação para os dias úteis. Isso fará com que algumas
linhas fiquem com o valor null, indicando que existe uma cotação nula (ou vazia) para aquela data.
Se precisar separar os dias úteis e não úteis na tabela calendário, uma boa estratégia seria criar uma
coluna condicional usando a informação/falta de informação para identificar os dias úteis e não úteis.
Porém, neste exemplo, por definição de negócio, vamos replicar a cotação do dia útil anterior para os
dias não úteis subsequentes.
Perceba que com a expansão das colunas de cotação, a ordem cronológica das linhas na tabela pode
ter sofrido alteração. Para garantir que vamos replicar as informações corretamente, primeiro vamos
classificar as datas em ordem crescente. Selecione a coluna Data, e em seguida cliquem Página
Inicial → Classificar em Ordem Crescente.
Para replicar as cotações para as células vazias abaixo, selecione as colunas cotacaoCompra e
cotacaoVenda e clique em Transformar → Preenchimento → Para Baixo.
caioferreira2002@outlook.com
Antes de carregarmos as alterações para o Power BI, precisamos desabilitar a carga da tabela
CotacaoDolar, visto que as informações já estão replicadas na tabela Calendario. Clique com o
botão direto na tabela CotacaoDolar e desmarque a opção Habilitar Carga. Por fim clique em Página
Inicial → Fechar e Aplicar.
Dica 1:
A função RELATED retorna um valor relacionado de outra
tabela.
USD Compra =
AVERAGEX(
Calendario,
IF(Calendario[Data] <= TODAY(), Calendario[cotacaoCompra])
)
Dica 2:
A função AVERAGEX é utilizada para calcular a cotação de
compra média do período. A condicional IF limita a cotação
apenas até a data do dia atual, retornando vazios para datas
futuras.
caioferreira2002@outlook.com
• Eixo: Calendario[Data]
Formato:
• Título: desativado
Formato:
• Título: desativado
CAPÍTULO
Capítulo 3: E X PLO R A N D O
LINGUAGEM DAX
3 A
EXPLORANDO
A LINGUAGEM
DAX
A linguagem DAX por ser uma linguagem de expressões faz com que muitos usuários vejam semelhanças
com as fórmulas e funções do Excel. Porém, pelo modelo de dados do Power BI ser um modelo tabular,
a linguagem DAX funciona através de contextos. Entender e aplicar esses contextos corretamente faz
total diferença ao criar métricas e analisar dados no Power BI.
O objetivo desse capítulo é explorar e entender com uma maior profundidade a linguagem DAX e os
seus contextos. Vamos utilizar o arquivo m2-parte2.pbix que você recebeu junto com os arquivos do
curso. Esse é praticamente o mesmo modelo de dados que fomos construindo desde o módulo 1.
Para vermos essa aplicação na prática vamos criar o mesmo cálculo duas vezes, sendo o primeiro
aplicado como medida e segundo como uma coluna calculada em uma tabela.
Nosso objetivo é classificar os vendedores em quatro classes diferentes de acordo com o volume de
vendas realizado conforme as regras a seguir:
• Vendedores que não realizaram vendas ainda serão classificados como “Novato”
caioferreira2002@outlook.com
Vamos começar criando uma coluna na tabela Vendedores. Clique no botão Dados e selecione a
tabela Vendedores. Em seguida clique em Ferramentas de Tabela → Nova Coluna.
É possível utilizar tanto a função IF quanto a função SWITCH para criação das condicionais. Com a
função IF será necessária uma expressão para cada condição. Para cada teste lógico informamos um
valor a ser retornado caso o teste lógico seja verdadeiro. A fórmula usando a função IF fica assim:
Classe =
IF([Soma Vendas] > 10000000 ; “Classe A” ;
IF([Soma Vendas] > 1000000 ; “Classe B” ;
IF([Soma Vendas] > 100000 ; “Classe C” ;
IF([Soma Vendas] > 0 ; “Classe D” ;
“Novato”))))
Com a função SWITCH no argumento expressão passamos um valor que desejamos obter, e em
seguida pares de valores e resultados. Quando a expressão for encontrada no valor, o resultado
correspondente será retornado.
A diferença entre as duas funções é que ao utilizar SWITCH é possível colocar todas as condições
dentro de uma única função. Sua aplicação consiste em passar um valor na expressão e expressões
que podem resultar esse valor com suas respostas correspondentes.
caioferreira2002@outlook.com
Classe =
SWITCH(
TRUE(),
[Soma Vendas] > 10000000 , “Classe A” ,
[Soma Vendas] > 1000000 , “Classe B” ,
[Soma Vendas] > 100000 , “Classe C” ,
[Soma Vendas] > 0 , “Classe D” ,
“Novato”
)
Informamos que desejamos obter a resposta para quando a expressão retornar verdadeiro – TRUE().
Em seguida informamos pares de argumentos com testes lógicos e as respostas que serão retornadas
quando o teste lógico retornar verdadeiro.
Como a fórmula está sendo criada em uma coluna, o contexto de linha é aplicado. Para avaliar a
expressão o Power BI calcula o valor da medida [Soma Vendas] para cada linha da tabela e então
compara com os valores. Tanto na função IF quanto na função SWITCH, o motor de cálculo DAX para
de avaliar as expressões seguintes quando encontra um valor verdadeiro.
Por isso para criar as faixas de intervalos é necessário testar apenas os limites superiores de cada
faixa, iniciando-se da maior até a menor faixa. O último valor especificado será sempre a exceção, ou
seja, quando todas as expressões testadas forem falsas, será retornado o último valor.
Com a coluna criada, vamos criar agora uma medida com a mesma fórmula. Selecione a tabela
medidas, e clique em Ferramentas da tabela → Nova medida.
caioferreira2002@outlook.com
Na barra de fórmulas que será exibida, digite a mesma fórmula usada para criar a coluna.
Classe =
SWITCH(
TRUE(),
[Soma Vendas] > 10000000 , “Classe A” ,
[Soma Vendas] > 1000000 , “Classe B” ,
[Soma Vendas] > 100000 , “Classe C” ,
[Soma Vendas] > 0 , “Classe D” ,
“Novato”
)
Perceba que tanto a medida quanto a coluna retornaram os mesmos valores ao serem inseridas no
visual. Isso aconteceu pois não há nenhum filtro aplicado ao relatório. Para visualizarmos a diferença
de aplicação dos filtros é necessário aplicar pelo menos um filtro.
Sendo assim, vamos aplicar um filtro no campo data. Utilizando a segmentação de dados disponível,
selecione o período de 01/01/2018 a 31/12/2019.
Agora é possível notar que há diferença retornada através da medida e da coluna calculada. Ao
avaliar a expressão [Soma Vendas] para fazer a comparação a medida levou em consideração os
filtros aplicados. Por isso, o vendedor Lucas Carvalho que antes era um vendedor “Classe A”, no
período selecionado realizou 6.782.825,13 em vendas, colocando-o como um vendedor “Classe B” no
período. Como o cálculo realizado na coluna não é influenciado pelo filtro, o valor de [Soma Vendas]
utilizado na avaliação da expressão é o valor total de 13.386.479,40 (antes do filtro ser aplicado),
colocando-o como um vendedor “Classe A”.
Entender essa diferença de avaliação é muito importante, pois em várias situações serão necessárias a
aplicação de cálculos tanto no contexto de linha – utilizando funções iterantes, por exemplo – quanto
no contexto de filtro, utilizando funções agregadoras.
caioferreira2002@outlook.com
A) Criar a medida [Freq. Cliente] usando a função SWITCH, de acordo com os seguintes abaixo e insira
no visual ao lado:
Outra situação que pode impedir que uma relação entre duas tabelas seja definida como ativa é a
existência de um caminho ambíguo para propagação dos filtros. E para proteger o funcionamento
correto do painel, o Power BI evita que sejam definidos mais de um relacionamento ou caminho
ativos entre duas tabelas.
Mas existe uma solução para essa situação. É possível ativar um relacionamento inativo utilizando
uma função específica – a USERELATIONSHIP – apontando as colunas das extremidades do
relacionamento.
Para esse primeiro exercício vamos calcular a quantidade de admissões e demissões de vendedores
ao longo do tempo. Para isso vamos utilizar as colunas Data.Admissao e Data.Demissao presentes na
tabela Vendedores.
caioferreira2002@outlook.com
Primeiro devemos criar a relação entre as tabelas Vendedores e Calendario, já que a função
USERELATIONSHIP ativa apenas relacionamentos existentes. Vamos começar pelo campo
Vendedores[Data.Admissao] arrastando-o para sobre o campo Calendario[Data].
Perceba que mesmo não existindo uma relação entre as tabelas Calendario e Vendedores,
automaticamente o Power BI definiu a relação que criamos como inativa, representada pela linha
pontilhada. Isso ocorreu devido a uma possível ambiguidade que seria criada no modelo no caminho
entre as tabelas Calendario e Vendas. Se analisarmos os relacionamentos e suas direções, seria
possível percorrer o caminho entre as tabelas Calendario e Vendas por dois caminhos diferentes. Um
primeiro passando pela tabela Vendedores, e um segundo mais curto saindo da tabela Calendario e
indo diretamente até a tabela Vendas.
Admissões =
CALCULATE(
COUNTROWS(Vendedores),
USERELATIONSHIP(Calendario[Data],Vendedores[Data.Admissao])
)
A função CALCULATE é utilizada sempre que necessitamos alterar o contexto de um cálculo. Como
por padrão a linguagem DAX utiliza os relacionamentos ativos para avaliar uma expressão, será
necessário alterar o contexto através da função CALCULATE.
Com a expressão a ser calculada especificada, vamos definir o segundo argumento da função
CALCULATE que é o novo contexto da expressão. Para ativar um relacionamento inativo é utilizado
a função USERELATIONSHIP apontando as duas colunas que compõe o relacionamento. Importante
lembrar que para que a função USERELATIONSHIP funcione, a relação inativa deve existir no modelo.
Vamos repetir o mesmo processo para calcular a quantidade de vendedores demitidos. Primeiro crie a
relação entre as colunas Calendario[Data] e Vendedores[Data.Demissao].
Demissões =
CALCULATE(
COUNTROWS(Vendedores),
USERELATIONSHIP(Calendario[Data],Vendedores[Data.Demissao])
)
Para visualizar os valores das medidas criadas, vamos inserir um gráfico de colunas clusterizado com o
esquema de campos a seguir:
• Eixo: Calendario[Ano]
B) Criar a medida [Soma Faturamento] para calcular a soma de vendas pela Data.Faturamento
Uma dessa funções é a VALUES, que gera uma tabela com valores distintos a partir de uma coluna ou
tabela especificada.
Para entender melhor o funcionamento da função VALUES e das tabelas virtuais vamos criar a medida
a seguir:
O erro ocorre pois os visuais aceitam apenas medidas que podem ter os seus resultados agregados,
diferente do que é fornecido pela função VALUES que é uma lista de valores. Se clicar no link Ver
detalhes será exibida uma mensagem explicativa sobre o erro.
A medida criada irá gerar uma tabela com os números de cada pedido (sem repetição). Podemos
então utilizar a função COUNTROWS para contar as linhas da tabela virtual gerada pela função VALUES
e obter a quantidade de pedidos. Vamos alterar a medida criada anteriormente.
Perceba que a função VALUES foi utilizada dentro de uma função onde o seu argumento pede uma tabela.
A contagem de linhas fará que o resultado da medida criada seja sempre uma agregação – a
contagem de pedidos únicos da tabela Vendas. O cálculo que criamos é uma variação do mesmo
cálculo que pode ser obtido utilizando a função DISTINCTCOUNT.
Calculando a média da coluna Vl.Total o resultado seria ponderado pelo número total de linhas de
vendas, obtendo o valor 30 como resultado da média de cada venda. Se o objetivo é calcular o valor
da Média Mensal de Vendas é necessário primeiro calcular a soma de vendas para cada um dos
meses, e somente depois obter a média.
No primeiro argumento informamos a tabela com a lista de meses que é gerada usando a função
VALUES, e no segundo argumento solicitamos que para cada linha dessa tabela seja calculada a
[Soma Vendas]. Por fim a função AVERAGEX efetua a média dos valores calculados.
Para visualizar os valores para a medida criada, vamos criar um gráfico de colunas clusterizado com
o esquema de campos e formatação como indicados:
• Campos
o Eixo: Calendario[Ano]
• Formatação
o Eixo Y: desativado
As tabelas virtuais são importantes em diversos cálculos onde precisamos gerar análises em que os
contextos são diferentes dos apresentados no visual ou nas tabelas físicas do modelo. Além da função
VALUES, existem diversas outras funções que são capazes de gerar tabelas. Exemplos de funções que
retornam tabelas podemos citar a FILTER, DATESBETWEEN, DATESINPERIOD, SUMMARIZECOLUMNS,
TOPN dentre outras. Algumas dessas funções ainda serão abordadas neste treinamento.
caioferreira2002@outlook.com
A) Criar uma medida para calcular o Ticket Médio (valor médio de um pedido).
B) Criar uma medida para calcular o Maior Ticket (maior valor de um pedido).
Vamos criar a medida a seguir para calcular as vendas da categoria de produtos “Manteiga”.
Vendas Manteiga A =
CALCULATE([Soma Vendas],Produtos[Categoria]=“Manteiga”)
Isso fará com que o resultado da medida [Soma Vendas Manteiga A] retorne apenas as vendas da
categoria Manteiga, ignorando qualquer outra categoria de produtos.
Vamos inserir a medida [Soma Vendas Manteiga A] em visual de matriz, juntamente com a medida
[Soma Vendas] e distribuir os valores pelas Categorias de produtos.
caioferreira2002@outlook.com
Através da função FILTER é possível especificar uma tabela do modelo de dados e uma expressão
de filtro que será avaliada para cada linha da tabela. Apenas o que for considerado verdadeiro será
considerado na avaliação da expressão.
Vamos calcular novamente a soma de vendas da categoria manteiga utilizando a função CALCULATE e
FILTER, juntas.
Crie uma medida com a fórmula a seguir:
Vendas Manteiga B =
CALCULATE(
[Soma Vendas],
FILTER(
Produtos,
Produtos[Categoria] = “Manteiga”
)
)
O primeiro argumento da função FILTER pede uma tabela. Como queremos filtrar apenas os
produtos da categoria “Manteiga” devemos informar a tabela Produtos. O segundo argumento da
função é a expressão de filtro. Neste argumento devemos informar uma expressão lógica que será
avaliada para cada linha da tabela informada retornando VERDADEIRO (true) ou FALSO (false). Apenas
as linhas com resultado verdadeiro serão retornadas na tabela filtrada.
Acrescente a medida [Vendas Manteiga B] no visual criado no passo anterior e vamos comparar os
resultados.
caioferreira2002@outlook.com
Perceba que com a utilização da função FILTER, o contexto não foi forçado como quando utilizamos
o filtro diretamente na função CALCULATE. Isso ocorre, pois, a função FILTER apenas filtra os valores
já obtidos dentro do contexto atual. Dessa maneira apenas no contexto da categoria “Manteiga” e
no contexto “Total” retornam alguma linha na tabela filtrada. Nos demais contextos o filtro retorna
uma tabela vazia, e por isso o resultado da [Soma Vendas] também é vazio.
Outra característica importante da função FILTER é que ela permite, além das colunas, utilizar
também uma medida como composição de um argumento de filtro, enquanto diretamente na função
CALCULATE somente é possível utilizar colunas.
Imagine a seguinte situação: precisamos obter a [Soma Vendas] apenas dos clientes que tenham mais
de 75 mil reais em vendas. Vamos utilizar a função FILTER para retornar uma tabela que atenda o
critério especificado juntamente com a função CALCULATE para retornar o valor da [Soma Vendas].
Vendas Clientes>75k =
CALCULATE(
[Soma Vendas],
FILTER(
Clientes,
[Soma Vendas] > 75000
)
)
Agora, para analisarmos os resultados, vamos inserir a medida [Vendas Clientes>75k] em visual de
matriz e distribuir os valores pelas pelos anos.
caioferreira2002@outlook.com
Analisando os resultados, em um primeiro momento pode parecer que existe alguma inconsistência
no cálculo visto que o resultado é pouco mais de 93 milhões, enquanto nenhum dos valores anuais
é maior do que 7 milhões. Porém os resultados estão corretos, pois estão sendo levados em
consideração os contextos em que estão sendo calculados.
Para entender melhor o funcionamento da medida criada, imagine a o conjunto de dados hipotético
a seguir:
Quando utilizamos a função FILTER na tabela Vendedor com a expressão de filtro determinada como
[Soma Vendas] > 75000, apenas as linhas em que essa expressão for verdadeira será utilizada para
calcular o valor de [Soma Vendas] estipulado na função CALCULATE.
Em resumo, a linguagem DAX irá calcular a [Soma Vendas] para cada vendedor, para verificar se deve
incluí-lo na [Soma Vendas] final, conforme os critérios.
Ao inserir a medida em um visual que está dimensionado por ano, o cálculo será realizado para cada
um dos contextos de anos.
Utilizando os dados hipotéticos da tabela acima, primeiro vamos calcular a [Soma Vendas] apenas no
ano 2016, filtrando a tabela Clientes onde a [Soma Vendas] > 75000.
No contexto do ano 2016, podemos observar que apenas os Vendedores Ana e Ravi devem ser
incluídos no cálculo, pois foram os únicos que atingiram a condição especificada no filtro. O
Resultado para o ano 2016 seria 162.000, equivalente as somas de 78.000 da Ana e 84.000 do Ravi.
Agora vamos considerar o contexto Total onde as vendas de 2016 e 2017 estão totalizadas.
Nesta situação, os vendedores Ana, Maria e Ravi atenderiam a expressão de filtro especificada, pois
todos atingiram a [Soma Vendas] mínima de 75.000. O resultado total seria 413.000.
Para este conjunto de dados, teríamos então o seguinte resultado em um visual de matriz distribuído
por ano:
O maior aprendizado ao trabalhar com fórmulas, funções e expressões DAX é entender que cada
expressão é avaliada em cada contexto onde está inserida. E os contextos são sempre modificados
pelos filtros. Entenda cada conjunto de filtros como um contexto diferente.
No exercício anterior mostramos que o resultado total, apesar de parecer errôneo, está sendo
calculado corretamente para cada um dos contextos. Porém, se você ainda acredita que o resultado
exibido no total é falho, vamos analisar a diferença entre as duas necessidades informacionais
apresentadas:
• Calcular a [Soma Vendas] dos Clientes que compraram mais de 75.000 no ano.
Se não tivéssemos a referência dos anos, o resultado total seria exatamente o mesmo já obtido.
Agora, se o objetivo for somar as vendas apenas dos clientes que compraram mais de 75.000 em cada
ano, precisamos reescrever a fórmula considerando o cálculo para cada ano. E faremos isso utilizando
as funções SUMX e VALUES.
A função SUMX é responsável por efetuar um cálculo para cada linha de uma tabela especificada e
depois somar todos os resultados encontrados. Como queremos obter a [Soma Vendas] dos clientes
que obtiveram mais de 75.000 em cada ano, vamos precisar de uma tabela com a lista dos anos, que
será gerada com a função VALUES.
caioferreira2002@outlook.com
Perceba que nesta nova medida o argumento de expressão da função SUMX é exatamente o mesmo
da medida que criamos anteriormente. A diferença é que agora o cálculo será realizado para cada
linha da tabela de anos – gerada através da função VALUES – e somente depois os resultados serão
somados pela função SUMX.
Acrescente a medida [Vendas Clientes>75k Anual] no visual criado no passo anterior e vamos
comparar os resultados.
Se compararmos as duas medidas, os resultados obtidos nos contextos de cada ano são exatamente
os mesmos, porém o resultado no contexto total é diferente. Isso ocorre, pois primeiro é gerado uma
tabela com a lista de anos (VALUES), para depois calcular a [Soma Vendas] com os filtros aplicados
(FILTER), e por fim os resultados são somados (SUMX). Considerando o contexto individual em cada
ano, a lista de anos é composta apenas pelo próprio ano, então a soma dos valores é exatamente o
valor do ano. Já no total, a lista de ano é composta por todos os anos, então é calculada a expressão
da com o filtro, e por último o valor é somado.
caioferreira2002@outlook.com
A) Criar a medida [Pedidos 5+ Produtos] para calcular a [Qtde Pedidos] que contém 5 ou mais
produtos diferentes.
Isso faz com que tenhamos um dilema e uma decisão a tomar. Criar o cálculo como coluna para que
os valores possam ser utilizados como categorização em um visual sem que os resultados sejam
influenciados pelos filtros, ou criar uma medida para que os resultados sejam influenciados pelos
filtros, mas não possam ser utilizados como categorização em um gráfico.
A verdade é que é possível manter a melhor alternativa das duas opções desde que você crie uma
tabela com os resultados possíveis, e uma medida para fazer a agregação dos valores.
Nosso objetivo será classificar os clientes em 5 grupos de fidelidade – Bronze, Prata, Ouro, Platina
e Diamante – de acordo com a quantidade de pedidos realizados e criar um gráfico que mostre a
quantidade de clientes em cada grupo, conforme critérios se seguir:
Primeiro, vamos criar uma tabela com o nome Fidelidade e especificar cada uma das faixas de
agrupamento. Para inserir a tabela clique em Página Inicial Inserir Dados. Informe os dados
conforme a imagem.
caioferreira2002@outlook.com
Com a tabela criada, vamos criar uma medida que utilize a função CALCULATE para mudar o contexto
da medida [Qtde Clientes], e a função FILTER para filtrar a tabela Clientes considerando apenas
aqueles que atendem a condição onde a [Qtde Pedidos] esteja no intervalo especificado na tabela
Fidelidade.
Insira a medida criada em um visual de matriz conforme o esquema de campos exibido na imagem a
seguir.
Perceba que mesmo sem existir uma relação criada entre as tabelas Clientes e Fidelidade, o resultado
foi calculado corretamente. Isso foi possível pois a função FILTER foi responsável por filtrar a tabela
Clientes conforme a expressão de filtro de indicamos.
No primeiro argumento da função CALCULATE foi especificada a medida a ser calculada – [Qtde
Clientes] – que faz uma contagem distinta de vendedores. O segundo argumento é o contexto em
que a medida deve ser calculada. Para contar os clientes em cada faixa de fidelidade é necessário
aplicar um filtro à tabela Clientes para que retorne apenas os clientes que atendem o critério da faixa.
Para isso utilizamos a função FILTER.
Na função FILTER o primeiro argumento especificado foi a tabela Clientes, e o segundo foi a
expressão de filtro. Um detalhe importante é que para recorrer aos valores mínimo e máximo das
faixas de fidelidade foram utilizadas duas funções agregadoras – MIN e MAX, respectivamente. Isso
foi necessário, pois a função FILTER está no contexto de linha da tabela Clientes, e não tem acesso
aos valores da tabela Fidelidade, já que não existe uma relação entre as tabelas. Ao usar uma função
agregadora, os valores das colunas Fidelidade[Min] e Fidelidade[Max] serão resumidos em um único
caioferreira2002@outlook.com
valor, possibilitando a comparação com a medida [Qtde Pedidos] que está sendo avaliada para cada
linha da tabela Clientes. Ao inserir a medida criada em um visual onde há a segmentação das faixas
de fidelidade, os limites mínimo e máximo são calculados conforme os contextos do visual.
Para entender melhor o funcionamento dessa agregação e da função FILTER, considere o modelo
de dados a seguir, com os valores de [Qtde Pedidos] e [Qtde Clientes] já avaliados para os clientes
hipotéticos.
Agora vamos analisar como o cálculo da medida [Qtde Clientes Fidelidade] foi executado. Primeiro
vamos considerar a primeira linha do visual, com o contexto apenas da faixa de fidelidade “Bronze”.
Aplicando o filtro a todos os clientes, o resultado para a medida [Qtde Clientes] seria 2, pois apenas
os clientes Ana e Maria atendem aos critérios.
Perceba que para calcular a expressão MIN(Fidelidade[Min]) foi considerado apenas o valor de
linha Bronze, já que os demais valores não estão no contexto. O mesmo acontece com a expressão
MAX(Fidelidade[Max]). Uma dica importante é o operador && que equivale ao mesmo que uma
junção E. Utilizaríamos o operador || se fosse necessário utilizar um junção do tipo OU.
Se mudarmos o contexto da fidelidade para Platina, de forma semelhante, o resultado para a [Qtde
Clientes] seria 1.
Por fim, vamos considerar o contexto total, quando todas as faixas serão consideradas. Perceba que
as agregações MIN e MAX agora retornam os valores 0 e 999999, respectivamente, pois todas as linhas
da tabela fidelidade são consideradas no contexto total. O resultado neste contexto seria 8 para a
medida [Qtde Clientes].
Com medida e tabela criadas é possível utilizar as segmentações em qualquer tipo de visual, como por
exemplo um gráfico de roscas para exibir a composição da carteira de clientes por grupo de fidelidade.
Para incrementar a análise, vamos calcular a soma de vendas de todos os clientes em cada faixa de
fidelidade. Basta replicar a mesma lógica, trocando apenas a expressão que será avaliada pela função
CALCULATE. O contexto de filtro será o mesmo que aplicamos na medida anterior, visto que as regras
para cada faixa de fidelidade são as mesmas.
Insira a nova medida na composição do visual de matriz com as faixas de fidelidade que criamos no
primeiro exemplo deste capítulo.
caioferreira2002@outlook.com
Vá até o modelo de exibição Dados, selecione a coluna Fidelidade na tabela Fidelidade, e clique em
Ferramentas de coluna → Classificar por coluna. Por fim, selecione a coluna Max ou Min.
Os valores numéricos da coluna serão utilizados para determinar a ordem de classificação da coluna
Fidelidade. Ao voltar ao modo de visualização de relatório será possível observar que a ordem das
faixas modificou conforme o limite de cada faixa.
caioferreira2002@outlook.com
A) Criar a medida [Ticket Médio Fidelidade] para retornar ticket médio dos clientes em cada faixa de
fidelidade.
3.8 ACUMULADOS
É muito comum analisarmos métricas por períodos, principalmente quando elas possuem um objetivo
até certa data que deve ser atingido e variação de performance ao longo dos dias. Uma das métricas
periódicas mais comuns no mercado são os acumulados, podendo ser anual, também conhecido
como YTD (Year-to-date), acumulado trimestral conhecido como QTD (Quarter-to-date), ou até mesmo
acumulados em períodos móveis, como por exemplo dos últimos 12 meses, conhecido como MAT
(Moving annual total).
Porém, é importante salientar que as funções para cálculos acumulados não se limitam apenas
a somas, podendo ser utilizado qualquer agregador, como por exemplo a média acumulada
dos últimos 3 meses, o maior valor dos últimos 6 meses etc. O que vamos controlar é o período
acumulado, deixando a encargado da expressão indica no primeiro argumento da CALCULATE
executar a agregação.
Vamos começar criando uma métrica para gerar a soma de vendas acumulada no ano.
YEAR-TO-DATE
A função responsável gerar o período acumulado dentro do ano é a DATESYTD. O único argumento
obrigatório desta função é a coluna de datas. Esta coluna deve conter todas as datas possíveis e
sem repetição. Neste caso estamos nos referindo a chave primária da tabela calendário, a coluna
Calendario[Data].
caioferreira2002@outlook.com
O cálculo a ser realizado pela medida criada será o mesmo já realizado pela medida [Soma Vendas],
porém o contexto será modificado de forma que o período a ser somado considere todas as datas
desde o dia 01/01 do ano atual até o fim do contexto inserido.
Para verificarmos os resultados obtidos pela nova medida vamos criar um visual de tabela conforme o
esquema a seguir:
Perceba que o cálculo da [Soma Vendas] é considerado apenas o contexto atual inserido no visual,
enquanto a medida [Soma Vendas YTD] retorna o total acumulado dentro do ano até o contexto atual.
caioferreira2002@outlook.com
Um outro argumento que podemos informar na função DATESYTD é o Year-end-date que se refere
qual dia do ano será considerado o último dia do ano para efeito do acúmulo. Por exemplo, imagine
que deseja acumular os valores anuais começando no dia 01/07 e ir acumulando até o dia 30/06.
Devemos então informar a data 30/06 como o último dia do ano à função DATESYTD. Com a mudança
a medida ficaria assim:
Na linguagem DAX existe também a função TOTALYTD que equivale a junção das funções CALCULATE
e DATESYTD, e permite criar o acumulado anual com uma fórmula mais enxuta.
Utilizando a mesma função podemos calcular a média mensal de vendas acumulada do ano, apenas
apontando a medida que calcula a média mensal de vendas no primeiro argumento. Crie a medida
abaixo e coloque-a no visual de tabela que utilizamos no exemplo anterior.
A média mensal apresentada pela medida [Média Mensal Vendas YTD] equivale a média de mensal
de todos os meses do ano até o mês do contexto atual.
QUARTER E MONTH-TO-DATE
De forma semelhante é possível criar o acumulado de períodos diferentes, como trimestral ou mensal.
As funções equivalentes são DATESQTD para o período trimestral DATESMTD para mensal. Também é
possível utilizar as funções TOTALQTD e TOTALMTD, respectivamente.
caioferreira2002@outlook.com
Em algumas situações limitar a data final do acumulado a um período específico do calendário, como
o ano ou trimestre, não é o ideal. Muitas vezes é necessário que o acumulado seja realizado através
dos anos, como por exemplo para uma contagem de estoque ou fluxo de caixa. Em situações como
essas o mais viável é utilizar a função DATESBETWEEN para especificar o início e término do período
que queremos considerar no cálculo.
A sintaxe da função DATESBETWEEN possui três argumentos. O primeiro é a coluna de datas, e os dois
últimos são as datas inicial e final, respectivamente.
Por exemplo, se desejar criar uma medida para retornar a soma de vendas do ano de 2017, a fórmula
ficaria assim:
Perceba que nos argumentos StartDate e EndDate as datas foram informadas no padrão aaaa/
mm/dd. Porém, ao utilizar uma função com as datas literalmente digitadas não temos uma medida
dinâmica, e o valor retornado será sempre referente ao período informado.
Podemos usar a função DATESBETWEEN e aplicar outras funções para determinar o período desejado,
conforme a necessidade informacional.
Vamos criar uma função que irá retornar o acumulado desde o dia 01/01/2016 até a maior data do
contexto atual. Isso quer dizer que quando o contexto do visual for, por exemplo, julho/2018, o
período que a função DATESBETWEEN deve considerar deve ser 01/01/2016 até 31/07/2018, já que esta
é a maior data de julho/2018.
Para retornar a maior data de um contexto, vamos utilizar a função MAX e como argumento informar a
coluna de datas. A fórmula completa ficará assim:
Perceba que mesmo com a virada do ano a medida continuou acumulando os períodos.
caioferreira2002@outlook.com
O resultado é exatamente o esperado. Contudo, ainda forçamos o cálculo a começar em uma data
específica que foi 01/01/2016. O ideal é que a função assuma a menor data possível automaticamente.
E o segredo para fazer isso é informar o valor BLANK() no argumento StartDate da função
DATESBETWEEN. Fazendo as devidas correções, a fórmula ficará assim:
De forma análoga, podemos utilizar a função MIN para retornar a menor data do contexto atual, e
aplicar o valor BLANK() no argumento EndDate para criar uma medida de decréscimo. Desta forma,
o período avaliado será o primeiro dia do contexto atual até a última data disponível no calendário.
ACUMULADO MÓVEL
Outros indicadores técnicos muito utilizados em análises de tendência são os acumulados e médias
móveis. Através de uma métrica móvel podemos obter um resultado de uma métrica no decorrer de
um período definido. Em resumo, o período analisado irá se mover com o passar o tempo.
Uma das métricas desse tipo mais comum é o acumulado dos últimos 12 meses. Com ela é possível
sempre analisar um período de 12 meses com o passar do tempo. Sempre que um novo mês entra no
cálculo, o mês mais antigo é retirado, e assim por diante.
Mas esse tipo de métrica não se aplica apenas ao período de 12 meses. É possível determinar o
período de intervalo desejado. Para criar cálculos com períodos móveis com a linguagem DAX
utilizamos a função DATESINPERIOD em conjunto com a função CALCULATE.
A função DATESINPERIOD possui 4 argumentos – Coluna de datas, data inicial, número de períodos e
intervalo. Para criar um período móvel, a estratégia será semelhante a outros cálculos que já criamos.
Vamos utilizar como referência a maior data do contexto atual utilizando a função MAX, e informar o
número de períodos desejados para voltar, que para este exemplo será 12 meses.
caioferreira2002@outlook.com
MÉDIA MÓVEL
O cálculo da média móvel consiste na aplicação da mesma função DATESINPERIOD para definir o
período, bastando apontar na função CALCULATE uma medida ou expressão que calcule a média
desejada.
Vamos calcular a média mensal móvel de vendas dos últimos 3 meses. Como já temos a medida
[Média Mensal Vendas] vamos utilizá-la na fórmula, que ficará assim:
Média Móvel 3M =
CALCULATE(
[Média Mensal Vendas],
DATESINPERIOD(
Calendario[Data],
MAX(Calendario[Data]),
-3,
MONTH
)
)
A) Criar a medida [Qtde Clientes YTD] para retornar o acumulado anual da quantidade de clientes.
B) Criar a medida [Média Móvel 6M] para calcular média móvel mensal dos últimos 6 meses.
C) Inserir as medidas [Qtde Clientes], [Qtde Clientes YTD] e [Qtde Clientes Móvel 6M] em um visual
de tabela distribuídas pelas colunas Calendario[Ano] e Calendario[Nome do Mês], conforme o
esquema exibido a seguir:
caioferreira2002@outlook.com
No exemplo anterior criamos a medida [Média Móvel 3M] que retorna a média mensal de vendas
dos últimos 3 meses. Porém, ao invés de mantermos sempre 3 meses na média, podemos oferecer
ao usuário um parâmetro onde ele possa selecionar a quantidade de meses que deseja utilizar para
calcular a média mensal de vendas.
Primeiro vamos criar um parâmetro e definir o intervalo e o formato do valor que o usuário poderá
selecionar. Clique no menu Modelagem → Novo Parâmetro.
Uma caixa de diálogo será exibida onde poderemos informar os dados do parâmetro.
Devemos informar um nome para o parâmetro, o tipo de dados, o valor mínimo e máximo e um
incremento, além de um valor padrão. Informe os valores a seguir:
• Nome: Meses
• Mínimo: 2
• Máximo: 12
• Incrementar: 1
• Padrão: 2
caioferreira2002@outlook.com
Com as definições acima o usuário poderá selecionar qualquer número inteiro entre 2 e 12,
incrementando de 1 em 1. Caso o usuário pudesse selecionar apenas números pares, teríamos que
definir o incremento como 2. Isso faria com que o usuário pudesse selecionar apenas números que
partisse de 2 (mínimo) e fosse incrementado de 2 em 2. O valor padrão é o valor que o parâmetro irá
assumir caso o usuário não selecione nenhum valor.
Antes de clicar em OK você deve certificar que marcou a opção adicionar segmentação a esta
página, pois será esta opção que criará uma segmentação onde o usuário poderá selecionar o valor.
Ao clicar em OK um visual será criado.
É possível aplicar as formatações como em qualquer outro visual. Configure o formato do visual
conforme o esquema a seguir:
o Cor: #744EC2
• Entradas numéricas
Para selecionar um valor na segmentação, basta utilizar a bolinha do controle deslizante, arrastando-a.
caioferreira2002@outlook.com
ENTENDENDO O PARÂMETRO
Sempre que criamos um parâmetro, uma tabela com o mesmo nome e uma medida são gerados
no modelo de dados. A tabela é responsável por definir o intervalo e incremento do parâmetro, e a
medida por retornar o valor selecionado no parâmetro.
A tabela Meses foi gerada utilizando a função GENERATESERIES. Podemos alterar os valores
definidos ao criar o parâmetro, clicando sobre a tabela e trocando-os na barra de fórmulas.
Já a medida [Meses Valor] foi gerada usando a função SELECTEDVALUE, responsável por retornar o
valor selecionado em uma coluna – neste caso a coluna Meses do parâmetro.
Agora que já sabemos que a medida gerada pelo parâmetro retorna o valor selecionado pelo usuário,
podemos utilizá-la na parametrização de outras medidas. Vamos criar a medida para retornar a média
mensal móvel de vendas conforme o valor especificado no parâmetro.
caioferreira2002@outlook.com
Média Mensal XM =
CALCULATE(
[Média Mensal Vendas],
DATESINPERIOD(
Calendario[Data],
MAX(Calendario[Data]),
-[Meses Valor],
MONTH
)
)
A estrutura da fórmula é a mesma do exemplo anterior, apenas substituímos o número três, que
representava os meses, pela medida gerada pelo parâmetro.
APLICANDO EM UM GRÁFICO
Com a medida criada e atrelada ao parâmetro é só a inserir em um visual. Vamos utilizar um gráfico de
linhas conforme o esquema abaixo:
• Eixo: Calendario[Data]
Importante utilizar o recurso de drill-down para expandir para o nível de hierarquia abaixo até chegar
ao nível mensal, visto que as métricas estão calculadas neste nível.
Altere o valor do parâmetro e note as alterações na linha da média móvel. Quanto menor o tamanho
do período informado no parâmetro mais as duas linhas no gráfico se aproximam, visto que a soma
de vendas considera apenas um período representado pelo contexto atual.
A) Criar a medida [Qtde Clientes XM] para retornar a Qtde Clientes dos últimos X meses, conforme o
parâmetro selecionado pelo usuário.
B) Inserir em um gráfico de linhas as medidas [Qtde Clientes] e [Qtde Clientes XM] com o eixo
distribuído pelo campo Calendario[Data], conforme esquema abaixo:
caioferreira2002@outlook.com
3.10 RANKING
A posição de determinados itens em uma listagem é um dos indicadores mais utilizados no mercado.
Não somente sua posição atual, mas a comparação com posições específicas para acompanhar
alterações positivas e negativas. Alguns dos mais usados indicadores são: ranking de clientes,
vendedores e produtos.
Existe uma função específica para calculá-los no DAX chamada RANKX. Sua sintaxe possui cinco
argumentos, sendo que apenas dois são obrigatórios:
No argumento da Tabela, é muito importante utilizarmos uma função que ignorará o contexto de
filtro atual, como a ALL ou ALLSELECTED, pois do contrário o ranking será calculado apenas dentro
do contexto atual. Imagine criar um ranking com apenas um vendedor ou produto, o resultado seria
sempre o mesmo – 1.
No argumento Expressão, a medida ou função de agregação com que queremos avaliar o rank deve
ser inserida, como por exemplo, a soma de vendas, média e contagem.
Vamos começar utilizando apenas os argumentos obrigatórios para criação da nossa medida. Nosso
objetivo é criar um ranking de vendedores com base na [Soma Vendas] de cada um.
Rank Vendedores =
RANKX(
ALL(Vendedores),
[Soma Vendas]
)
Se preferir, ordene a tabela para exibir os vendedores em ordem pela [Soma Vendas]. Basta clicar
sobre o cabeçalho da coluna exibido na tabela.
caioferreira2002@outlook.com
Um detalhe muito importante ao criar uma medida para ranqueamento é o uso da função ALL na
tabela informada. Como estamos criando um ranking de vendedores, não pode haver filtros neste
contexto. Porém, ao utilizar a função ALL todos os filtros aplicados a tabela vendedor serão ignorados
para gerar o ranking, inclusive os supervisores, mostrando sempre um ranking geral de todos os
vendedores.
No exemplo abaixo foi aplicado um filtro para a supervisora Karine Lago. Perceba que os rankings
ainda continuam considerando a lista de todos os vendedores, e não apenas os vendedores da
supervisora Karine Lago. Com isso é possível notar que o melhor vendedor da Karine figura na
vigésima terceira posição na lista de todos os vendedores.
Um detalhe curioso é o ranking exibido no total – 17. Você consegue imaginar que resultado é
esse? Isso significa que se considerássemos todos os vendedores da Karine que venderam juntos
3.443.605,44, eles figurariam na décima sétima posição na lista de todos os vendedores. Significa
que existem 16 vendedores que venderam individualmente mais do que todos os vendedores da
supervisora Karine juntos.
caioferreira2002@outlook.com
Porém, se o objetivo for considerar apenas os vendedores da mesma equipe para calcular um ranking,
teremos que modificar a fórmula para ignorar os filtros apenas na coluna Vendedor, mantendo assim
outros filtros que possam ser aplicados a tabela Vendedores, como por exemplo o supervisor. Para
isso basta acrescentar o nome da coluna dentro da função ALL.
Rank Vendedores =
RANKX(
ALL(Vendedores[Vendedor]),
[Soma Vendas]
)
Agora mesmo que seja aplicado um filtro na coluna Supervisor, ele será respeitado para o cálculo do
ranking, considerando apenas os vendedores filtrados para calcular o ranking.
Por padrão a função RANKX utiliza apenas a medida informada na expressão para calcular o
ranqueamento. Mas é possível utilizar duas expressões diferentes na comparação.
Por exemplo, queremos determinar qual a posição um determinando vendedor atingiria caso
tivesse realizado 20% a mais de vendas. Precisamos comparar a [Soma Vendas] com o [Soma Vendas]
majorada em 20%. Para isso basta informar um novo valor que será comparado no terceiro argumento
da função RANKX – o Valor.
Ranking +20% =
RANKX(
ALL(Vendedores[Vendedor]),
[Soma Vendas],
[Soma Vendas] * 1.2
)
caioferreira2002@outlook.com
O vendedor Arthur realizou 12.811.424,19 em vendas figurando na quinta posição do ranking. Porém,
caso tivesse realizado 20% a mais de venda, teria atingindo o valor de 15.373.709,03 o que o colocaria
na terceira posição do ranking.
O argumento valor é muito útil quando necessitamos criar cenários hipotéticos e criar rankings
entre duas medidas. Uma dica seria utilizar o recurso parâmetro que aprendemos anteriormente
para permitir que o usuário defina o percentual de majoração do valor, por exemplo, influenciando
diretamente o cálculo do novo ranking.
Em um ranking nem sempre o maior valor significa o melhor resultado. Imagine que esteja criando
um ranking de vendedores por pedidos devolvidos. Quanto menor a quantidade de pedidos
devolvidos, melhor. É possível determinar a ordem da classificação no argumento Order, onde DESC
é descendente e ASC é ascendente. Por padrão, quando não informado, é considerado descendente,
ou seja, do maior para o menor.
Os dois estão empatados na posição 121. Não há nada de errado com isso, visto que os dois
vendedores atingiram os mesmos resultados. Porém, um questionamento que pode ser realizado é
se o próximo vendedor da lista, deve ser considerado o centésimo vigésimo segundo ou centésimo
vigésimo terceiro colocado.
Bem, a verdade é que podemos definir se queremos que o próximo valor do ranking seja pulado
ou não. Será com o argumento Ties que faremos o tratamento desses empates e de qual será o
próximo valor no ranqueamento. Ao declarar o valor do argumento como Skip, o próximo ranking
será definido pulando todas as posições de empates. No exemplo citado, o vendedor Antônio Dias
seria considerado o centésimo vigésimo terceiro colocado. Já, se definirmos o valor do argumento
como Dense, o próximo ranking será definido com a próxima posição sem pulos. Assim o vendedor
Antônio figuraria na centésima vigésima segunda posição.
Vamos alterar a medida [Ranking Vendedores] e definir o argumento ties como dense.
Rank Vendedores =
RANKX(
ALL(Vendedores[Vendedor]),
[Soma Vendas],,,
Dense
)
Agora é possível perceber que a contagem do ranking não pula nenhuma classificação.
caioferreira2002@outlook.com
CRITÉRIOS DE DESEMPATE
A função RANKX não possui nenhum argumento onde pode ser informado uma segunda medida
como critério de desempate. Porém existe uma técnica que pode ser aplicada no ranqueamento para
que outras medidas sejam consideradas como critérios de desempate.
Vamos definir como regra de negócio que caso dois ou mais vendedores obtenham o mesmo
resultado em vendas, o valor da maior venda será utilizado como critério de desempate.
Rank Vendedores =
RANKX(
ALL(Vendedores[Vendedor]),
([Soma Vendas] * 10^7) + ([Maior Venda] * 10^0)
)
A técnica consiste basicamente em criar uma expressão que é composta por todas as medidas
de critérios atribuindo pesos diferentes a cada uma dela. Se a medida [Soma Vendas] é a métrica
principal devemos multiplicá-la por peso maior, em seguida vamos somar com a segunda medida
multiplicada por um peso menor, e assim sucessivamente.
A atribuição de pesos é importante para evitar que um critério que tem menor importância tenha
influência sobre um critério de maior importância ao realizar as somas das medidas. Imagine a
seguinte situação onde devemos calcular o ranking considerando a [Soma Vendas] como critério
principal e a [Maior Venda] como critério de desempate.
Se simplesmente somarmos as duas medidas, faríamos com que a vendedora Gabriela ficasse a frente
dos vendedores Lucas e Ravi, mesmo tendo realizado menos vendas no total.
caioferreira2002@outlook.com
Quando aplicamos um fator de peso as métricas, evitamos que situações como essa ocorra. Tome
agora como exemplo o mesmo ranking, mas atribuindo um peso de 100 para a [Soma Vendas] e um
peso de 1 para a [Maior Venda].
Por isso é tão importante a atribuição de pesos para evitar que haja uma avaliação errônea. E tão
importante quanto atribuir um peso, é definir o tamanho dos pesos conforme a grandeza das
pedidas. Quanto maior a grandeza, maior devem ser a diferença nos pesos.
A) Criar a medida [Rank Produtos] para calcular o ranking de produtos pela [Soma Vendas] permitindo
o filtro pelas categorias de produtos.
C) Inserir a medida [Rank Produtos] num visual de tabela conforme esquema a seguir.
caioferreira2002@outlook.com
caioferreira2002@outlook.com
CAPÍTULO
No Power BI é possível configurar os dados e os usuários que poderão acessar relatórios com a
segurança em nível de linha, também conhecida como RLS (Row Level Security).
Com a segurança em nível de linha podemos determinar filtros que serão aplicados obrigatoriamente
quando determinado usuário acessar o relatório no Power BI Serviço.
Por exemplo, este mesmo relatório criado pode ser acessado por vários usuários, porém cada
um poderá “enxergar” apenas os dados da sua unidade. Para isso vamos criar funções de acesso
diferentes – uma para cada unidade – com filtros pré-determinados, e depois especificar quais
usuários estarão atrelados a essas funções, permitindo assim que os filtros pré-determinados para
cada função sejam aplicados sempre que um usuário desta função acessar o relatório.
O primeiro passo é criar uma função e depois atribuir um nome. Vamos começar criando a função
referente a unidade Garoa. Em seguida vamos criar os filtros utilizando expressões DAX em cada
tabela. Neste exemplo queremos aplicar um filtro na tabela Unidades para que sejam exibidas
apenas a unidade “Garoa”. Clique nos três pontos em frente ao nome da tabela, e em seguida
escolha a opção Adicionar Filtro e escolha o campo Unidade.
Por fim, altere a expressão criada, definindo a unidade como Garoa. É possível adicionar múltiplos
filtros em uma mesma tabela ou em tabelas diferentes para a mesma função. Utilize os operadores
lógico && (E) e || (OU) para adicionar mais de uma condição para o filtro.
caioferreira2002@outlook.com
Com a função criada, é possível conferir se a configuração realizada está filtrando corretamente os
dados e, consequentemente, o relatório. Ainda na guia Modelagem no Power BI Desktop, clique em
Exibir como e escolha a função que criamos – Garoa.
Entretanto, os usuários não acessarão os relatórios pelo Power BI Desktop, mas sim pelo Power BI
Serviço. Por isso, é necessário ainda configurar o restante desse processo lá.
caioferreira2002@outlook.com
Após publicar o relatório com o RLS estabelecido, no Power BI Serviço vá na seção Conjunto de
dados e clique nas opções do conjunto relacionado a esse relatório. Posteriormente, acesse a
Segurança.
A função criada no Power BI Desktop chamada Garoa aparecerá na listagem de RLS e agora basta
atribuir membros (e-mail com contas Pro do Power BI) às funções para finalizar a proteção do acesso
aos dados do relatório.
Vamos adicionar a Karine como membro da função Garoa. Informe o e-mail, clique em Adicionar e
depois em Salvar.
IMPORTANTE: Este relatório está publicado no domínio da DATAB, por isso é possível visualizar os
membros dentro do domínio.
caioferreira2002@outlook.com
Depois de compartilhar o relatório com a Karine, assim que ela o acessar somente conseguirá
visualizar os dados da unidade Garoa.
Sempre faça esse processo todo antes de compartilhar relatórios com pessoas que devem ter acesso
restrito. O RLS pode ser incluído em casos desde simples a complexos, com mais de um campo de
filtro também. Apenas lembre-se de testá-lo antes de publicar para verificar se o filtro está sendo
aplicado corretamente, de acordo com a propagação dos relacionamentos no modelo.
Quando um relatório possui RLS, sua capacidade de publicação na web (sem controle de acesso)
não será mais permitida. O máximo de usuários atribuídos às funções são 1.000. Para facilitar sua
atribuição, recomendamos utilizar grupos de segurança ao invés de e-mails individuais.
caioferreira2002@outlook.com
CAPÍTULO
Esta sessão da apostila é apenas para conferência e correção. O ideal é que o você tente primeiro
executar os exercícios propostos e somente depois realize a consulta das soluções.
A)
Freq. Cliente =
SWITCH(
TRUE(),
[Qtde Pedidos] > 40 , “Alta” ,
[Qtde Pedidos] > 10 , “Média” ,
[Qtde Pedidos] > 0 , “Baixa”
)
B)
Os resultados das medidas podem variar conforme os filtros. O visual acima não possui nenhum filtro
aplicado.
caioferreira2002@outlook.com
A)
B)
Soma Faturamento =
CALCULATE(
[Soma Vendas],
USERELATIONSHIP(Calendario[Data],Vendas[Data.Faturamento])
)
C)
Os resultados das medidas podem variar conforme os filtros. O visual acima não possui nenhum filtro
aplicado.
caioferreira2002@outlook.com
A)
Ticket Médio =
AVERAGEX(
VALUES(Vendas[Pedido]),
[Soma Vendas]
)
B)
Maior Ticket =
MAXX(
VALUES(Vendas[Pedido]),
[Soma Vendas]
)
C)
Os resultados das medidas podem variar conforme os filtros. O visual acima não possui nenhum filtro
aplicado.
A)
Pedidos 5+ Produtos =
CALCULATE(
[Qtde Pedidos],
FILTER(
VALUES(Vendas[Pedido]),
[Qtde Produtos] >= 5
)
)
caioferreira2002@outlook.com
B)
Os resultados das medidas podem variar conforme os filtros. O visual acima não possui nenhum filtro
aplicado.
A)
B)
caioferreira2002@outlook.com
Os resultados das medidas podem variar conforme os filtros. O visual acima não possui nenhum filtro
aplicado.
A)
ou
B)
C)
caioferreira2002@outlook.com
Os resultados das medidas podem variar conforme os filtros. O visual acima não possui nenhum filtro
aplicado.
A)
Qtde Clientes XM =
CALCULATE(
[Qtde Clientes],
DATESINPERIOD(
Calendario[Data],
MAX(Calendario[Data]),
-[Meses Valor];
MONTH
)
)
B)