Thiago Zavaschi R2 www.zavaschi.com

16May/112

PowerPivot – DAX – Entendendo o contexto de execução

Olá a todos!

Hoje continuo com o tema DAX.

Introdução ao Contexto de Execução

Antes de entrar nas especificidades de cada função, conforme anunciei no meu último post que o faria, é importante frisar que o resultado obtido é sempre baseado no contexto atual. O contexto pode vir da tabela que você está trabalhando (novas colunas ao modelo) ou ao conjunto tratado pela measure.

E o que pode afetar/criar esse contexto?

Basicamente o contexto vem dos filtros aplicados (filtros nas funções ou slicers). Isso afeta o resultado esperado, por exemplo ao utilizar um slicer (segmentador de dados) temos uma redução de contexto.

Quando estamos trabalhando com valores relativos, por exemplo, considere o seguinte conjunto de dados e a seguinte DAX:

image

=SUM(Tabela[Categoria])

Temos um resultado semelhante a:

image

Neste momento estamos trabalhando com o conjunto total dos dados, mas ao marcar um slicer, por exemplo “Rock”, temos o filtro sobre o conjunto usado:

image

 image

Ok, Thiago até aí ok, mas em que cenários que devo me atentar quanto a isso? Por exemplo, e se você possuir uma expressão DAX para calcular uma média, onde o denominador seja o somatório total das vendas ?

Algo como:

Vendas / Todas as vendas independente de categoria ?

Você poderia pensar em algo como =SUM(Tabela[Categoria])/SUM(Tabela[Categoria]), e manter a divisao por categorias, mas a conta não faria sentido, pois tanto o numerador quanto o denominador resultariam em um valor flutuante de acordo com o contexto.

Como resolver então?

Existem três funções que podem ajudar que são: CALCULATE(), ALL() e ALLExcept().

O CALCULATE serve para manipular o contexto, e o ALL e ALLExcept servem para retornar regiões dos dados de forma invariável ao contexto dos slicers (ALL) e podendo ter excessões (ALLExcept).

Na prática ficaria algo como:

=SUM(Tabela[Valor])/CALCULATE(SUM(Tabela[Valor]),ALL(Tabela))

Assim, mesmo aplicando um slicer, o resultado da medida (measure) para aquela categoria é baseado no valor total(denominador) e não mais no contexto dos slicers, veja:

image

image

Por hoje é só pessoal! :)

Este artigo é parte de uma série de artigos sobre PowerPivot e DAX. Confira os outros artigos sobre PowerPivot no link: http://zavaschi.com/index.php/tag/powerpivot/

Abraços!
Thiago Zavaschi

9May/110

PowerPivot – DAX – Time Intelligence Functions

Olá pessoal beleza? Estou tentando retomar o ritmo dos posts!

Se vocês analisarem a sequência de posts sobre Business Intelligence (http://zavaschi.com/index.php/business-intelligence/) vocês vão perceber que estou dando um foco grande em DAX. O motivo é claro: com a chegada do SQL Server 11 (Denali) também chega um novo modelo para as bases multidimensionais do Analysis Services conhecido como BISM (BI Semantic Model).

Através do Visual Studio 2010 será possível criar modelos do BISM (da mesma forma que criamos os modelos do PowerPivot dentro do Excel) e fazer o deploy para o servidor do SSAS.

Uma das grandes diferenças é que a manipulação do modelo BISM será feita usando DAX (e não MDX), sim a mesma DAX que temos hoje no PowerPivot Excel, acrescida de uma série de novas funções e capacidades.

Temos 35 funções nesta categoria na versão atual, é possível que esse número aumente quando possuirmos os modelos BISM (e podemos subdividir em 3 sub categorias):

  1. Funções que retornam uma data
  2. Funções que retornam uma tabela de datas
  3. Funções que resolvem uma expressão sobre um período de tempo

FIRSTDATE

LASTDATE

FIRSTNONBLANK

LASTNONBLANK

STARTOFMONTH

STARTOFQUARTER

STARTOFYEAR

ENDOFMONTH

ENDOFQUARTER

ENDOFYEAR

PREVIOUSDAY

PREVIOUSMONTH

PREVIOUSQUARTER

PREVIOUSYEAR

NEXTDAY

NEXTMONTH

NEXTQUARTER

NEXTYEAR

DATESMTD

DATESQTD

SAMEPERIODLASTYEAR

DATEADD

DATESBETWEEN

DATESINPERIOD

PARALLELPERIOD

DATESYTD

TOTALQTD

TOTALYTD

TOTALMTD

OPENINGBALANCE
QUARTER

OPENINGBALANCE
YEAR

OPENINGBALANCE
MONTH

CLOSINGBALANCE
MONTH

CLOSINGBALANCE
QUARTER

CLOSINGBALANCE
YEAR

 

Os próximos posts sobre DAX serão sobre cada um destes 3 grupos!

Este artigo é parte de uma série de artigos sobre PowerPivot e DAX. Confira os outros artigos sobre PowerPivot no link: http://zavaschi.com/index.php/tag/powerpivot/

Abraços,
Thiago Zavaschi

24Jun/100

PowerPivot – DAX – Tipos de Funções DAX

Olá!

Comecei a falar das DAX e esqueci de mencionar algumas coisas importantes.

Primeiramente: é possível usar diversas fórmulas do Excel dentro do PowerPivot (eu disse diversas, isso não significa todas).

E segundo: Há funcões que só existem dentro do PowerPivot, que facilitam (e muito) a nossa vida para extrair as informações.

As funções disponíveis podem ser divididas nas seguintes categorias (fonte):

Date and time

=WEEKDAY([OrderDate],1)

Retorna o número do dia na semana. Onde 1 é domingo e 7 é sábado.

Filter and value

=FILTER(ProductSubcategory,
[EnglishProductSubcategoryName]
= "Road Bikes")

Returna um subconjunto de uma tabela baseada numa expressão de filtro.

Information

=IsNumber([OrderQuantity])

Retorna TRUE se o valor é numérico e FALSE se não.

Logical

=IF([OrderQuantity]<10,"low",
IF([OrderQuantity]<100,"medium"
,"high"))

Retorna o valor do segundo argumento se o valor do primeiro argumento for verdade. Caso contrário retorna o valor do terceiro argumento.

Math and trig

=ROUND([SalesAmount] *
[DiscountAmount],2)

Retorna o valor do primeiro elemento arredondado pro número de dígitos do segundo elemento.

Statistical

=AVERAGEX(ResellerSales,
[SalesAmount]-
[TotalProductCost])

Resolve a expressão do segundo argumento para cada linha da tabela no primenro argumento e então calcula a média aritmética.

Text

=CONCATENATE([FirstName],
[LastName])

Retorna uma string da junção de dois itens em texto.

Time Intelligence

=DATEADD([OrderDate],10,day)

Retorna uma tabela de datas obtidas pela adição de dias (ou outro tipo especificado no terceiro parâmetro)especificados no segundo argumento na data passada no primeiro parâmetro.

Meu objetivo é abordar cada grupo e mostrar algumas peculiaridades e como funcionam.

E na sequência postar alguns problemas comuns que vocês terão que resolver (e eu também) usando DAX.

Este artigo é parte de uma série de artigos sobre PowerPivot e DAX. Confira os outros artigos sobre PowerPivot no link: http://zavaschi.com/index.php/tag/powerpivot/

Abraços,
Thiago Zavaschi

19Jun/100

PowerPivot – DAX – Time Intelligent Functions – Golden Rules

Olá!

Estou desenvolvendo um trabalho de BI para um cliente baseado no Powerpivot. Esta solução vai fazer uso intensivo de datas.

Existem algumas “regras de ouro” (“Golden Rules”) quando se está trabalhando com datas no PowerPivot.

São elas (fonte: Kasper de Jonge, para variar, hehe, o cara é fera!):

  1. Nunca usar a coluna datetime da tabela fato nas funções de tempo.
  2. Sempre criar uma tabela Tempo (dimensão de tempo) separada.
  3. Crie relacionamentos entre as tabelas fato e a tabela de tempo.
  4. Tenha certeza de que os relacionamentos são baseados na coluna datetime (e não em outra chave artificial).
  5. A coluna datetime na tabela tempo deve estar na granularidade de dia (sem frações dentro do mesmo dia).

Nos próximos posts veremos melhor estes processos.

Este artigo é parte de uma série de artigos sobre PowerPivot e DAX. Confira os outros artigos sobre PowerPivot no link: http://zavaschi.com/index.php/tag/powerpivot/

Abraços,
Thiago Zavaschi

17Jun/100

PowerPivot – DAX – Função DATE

Olá pessoal,

Temos disponíveis entre as DAX uma série de funções para análise de tempo e datas (também conhecidas como time intelligent functions, que abordarei aos poucos).

Hoje venho relatar a função DATE e as suas peculiaridades (ao menos nesta versão do PowerPivot, também conhecida como v1), mais informações podem ser vistas no FAQ: http://powerpivotfaq.com).

A primeira função que devemos nos atentar é a função DATE. O seu objetivo é simples: retornar em formato de data sobre os inteiros passados como parâmetros.

Sintaxe: DATE(ano, mês, dia).

Exemplo 1: Retornando uma data simples.

=DATE(2010, 06, 17).

O retorno será dia 17, mês junho, ano 2010. Simples não? Lembrando que os parâmetros podem vir de resultados de outras expressões DAX (por exemplo de outra coluna). Veja abaixo:

image

Exemplo 2:

Apesar de simples, devemos nos atentar para pequenos detalhes que podem nos levar a problemas nas nossas manipulações de datas.

O que você acha que retorna a seguinte expressão DAX: =DATE(08, 06, 01)?

Se voc6e respondeu dia 01 de junho de 2008 errou! Na realidade representa 01/06/1908! Pois anos até 1899 são somados ao valor 1900. 1900 + 08 = 1908, entendeu?

Se desejar 2008, é necessário que o valor passado seja 2008. Mas como resolver isto se a minha coluna veio importada de uma fonte que trata 08 como 2008? Simples: Crie uma coluna computada que tranforme de 08 para 2008.

A imagem abaixo demonstra a questão do valor menor que 1900 receba uma soma de 1900 para o cálculo do ano. Anos de 1900 para cima não recebem o acréscimo.

image

Atente que 1789 foi para o ano 3689, e 1900/1995 permaneceram os mesmos.

Exemplo 3: Manipulando os dias (e meses).

O terceiro parâmetro é a referência ao dia.

Atenção pois há peculiaridades também: Se informar um valor de dia maior que o que o mês pode comportar (dia 31 para o mês de fevereiro, ou passar o valor 45 como dia), esse valor será somado.

Por exemplo: se informar 45 em um mês que deveria ter 30 dias apenas, será somado mais 15 dias e cairá na metade do mês seguinte.

De maneira similar, se informar uma data negativa será decrescido o valor informado.

Veja a imagem abaixo com alguns exemplos.

PS: O mesmo comportamento é aplicado ao parâmetro com o número do mês informado.

image

 

Bom pessoal era isso o que eu queria mostrar hoje. É mais para vocês não subestimarem as funções simples, pois se não conhecermos os detalhes teremos resultados muitas vezes inesperados e difíceis de rastrear.

Este artigo é parte de uma série de artigos sobre PowerPivot e DAX. Confira os outros artigos sobre PowerPivot no link: http://zavaschi.com/index.php/tag/powerpivot/

Abraços,
Thiago Zavaschi

16Jun/102

PowerPivot – Data Analysis Expressions DAX – Intro

Então pessoal. :)

Creio que muitos que acompanham as evoluções do PowerPivot já devem ter se deparado com o seguinte pensamento: falta material sobre DAX em português e as referências externas (em inglês ao menos) são sempre de blogs de especialistas (Rob Collie, Kasper de Jonge, Vidas Matelis).

A minha proposta é seguir na mesma linha (já que meu principal canal de difusão de informação é este blog mesmo) e fornecer um pouco de conteúdo sobre DAX, mas em português. Já fiz alguns posts de introdução ao PowerPivot, então creio que valha a pena explorar num nível técnico mais profundo. Claro que se sugirem dúvidas podem perguntar :).

DAX é a abreviação para Data Analysis Expressions. É uma “evolução” da liguagem de fórmulas do Excel e só funcionará par a manipulação da base do PowerPivot dentro do seu workbook.

As DAX são importantes pois: devido a semelhança com a (já conhecida) linguagem de fórmulas do Excel e também por possibilitarem uma flexibilidade na análise dos dados. A capacidade de escrever as DAX e elas serem sensíveis aos slicers do Excel 2010 gera um ganho muito grande de capacidade de análise.

Agora vamos por a mão na massa. Neste artigo apresento uma introdução dos dois tipos de expressões DAX que podem ser criadas. Nos próximos artigs vou assumir que os concents apresentados aqui já estão assimilados.

Temos dois lugares onde podemos utilizar as DAX:

1) Através de novas colunas associadas a uma determinada tabela importada no PowerPivot, conhecidas como “calculated columns”. O resultado desta expressão DAX é armazenado juntamente aos seus dados. O uso deste tipo de DAX (em geral) não deve acarretar problemas de performance.

Há algumas experiências (do pessoal que citei no início do post principalmente) que relatam que a taxa de compressão adquirida pelo VertiPaq atravém de colunas importadas é maior que sobre as colunas calculadas. Não fiz um teste com uma massa grande ainda, mas o que eles querem dizer é que: nos casos em que o cálculo pode vir já feito no momento da importação a compressão (sobre o tamanho final do workbook) possui maiores ganhos. A seguir um exemplo da criação de uma coluna utilizando DAX ou trazendo da fonte de dados diretamente. Há outras utilizadades para colunas computadas que veremos ao longo do artigo e em artigos futuros.

Por exemplo:

Usar a expressão DAX como coluna computada: =Tabela[coluna1] * Tabela[coluna2].

É equivalente a importar (do SQL Server por exemplo) com uma coluna computada na query:

SELECT *, coluna1 * coluna2 FROM Tabela

 image

2) Através de DAX Measures (medidas) que são calculadas tendo como base uma tabela ou uma coluna. Este cálculo será executado para cada célula que o contiver. Então atenção quando utilizá-las!

Uma DAX Measure é basicamente uma fórmula DAX (estilo a usada para a criação de uma coluna) associada a um nome (e a uma tabela).

Um aspecto positivo das DAX Measures é que elas operam sobre o conjunto atual da PivotTable. A cada intereçaão dos slicers temos o recálculo dos valores das measures e com isso temos a atualização dos valores mostrados nos gráficos e tabelas.

Por exemplo:

Vou criar uma DAX measure para o exemplo mostrado na figura anterior que fará a soma dos elementos da coluna nomeada “Valor”.

Ficar complicado (por ter muitos elementos) eu usar a coluna Valor como fonte do slicer (ver figura abaixo). Então o que fazer nestes casos?

image

Conforme vimos no tópico anterior, é possível criar colunas através de expressões DAX. uma saida então é criar uma nova coluna que agrupe os valores. (isso não é um case, os exemplos são apenas para fins didáticos, por isso são simples).

Vou criar uma coluna que categorize os elementos da coluna valor quando são menores que 10, entre 10 e 20, e maiores que 20. Em exemplos futuros abordaremos melhor esta estratégia de categorização.

Notas sobre a sintaxe da DAX:

* Estou usando o operador IF, que apesar de simples é extremamente importante para se obter os resultados desejados.

* O operador de concatenação de strings é o &.

* Para me referir a uma tabela eu simplesmente digo o nome da mesma, para me referenciar a uma coluna utiliza-se: NomeTabela[NomeColuna].

* Operadores MAX e MIN (perceba que não são os novos MAXX e MINX, estes veremos em artigos futuros) calculam os valeres máximos e mínimos das colunas passadas como parâmetro a eles).

* Aninhei um segundo IF no parâmetro “else” do primeiro.

A expressão resultante é a seguinte (também pode ser observada na figura abaixo):

=IF(Tabela[Valor] < 10, MIN(Tabela[Valor]) & " |- 10", IF(Tabela[Valor] <= 20, "10 |- 20", "20 |- " & MAX(Tabela[Valor])))

image

Usar essa nova coluna (GrupoValor) como um slicer tornou a coisa bem mais interessante, não? :)

image

Agora seleciono a PivotTable e vou em “New Measure” lá na ribbon. E crio a seguinte expressão DAX (perceba que também aparece na PowerPivot Field List com um pequeno ícone ao lado):

=SUM(Tabela[Valor])

image

Adicione esta measure como valor na PivotTable e adicione a coluna GrupoValor como um slicer. Pronto! Selecione os slicers e veja que o valor total é alterado de acordo com o que foi marcado! :)

image image

Aguardem novos posts sobre DAX em um futuro (espero que) não muito distante!

Este artigo é parte de uma série de artigos sobre PowerPivot e DAX. Confira os outros artigos sobre PowerPivot no link: http://zavaschi.com/index.php/tag/powerpivot/

Abraços,
Thiago Zavaschi

11May/100

PowerPivot Lançado, BI Conference Brasil, MCITP

Finalmente depois de tanto tempo no CTP de novembro (CTP3), incompatível com o Office 2010 RTM, foi lançado publicamente o PowerPivot for Excel!

Link para download: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=e081c894-e4ab-42df-8c87-4b99c1f3c49b

Lembrem-se de baixar de acordo com a arquitetura do seu Excel instalado (x86 ou x64)!

É uma grande notícia!

Eu já estava há algumas semanas com o RTM e posso dizer que está muito mais rápido (umas 3x nos meus testes).

--

A segunda parte do post é para informar que fui convidade pelo João Nunes (gerente do time de SQL Server aqui do Brasil) para dar uma palestra sobre PowerPivot e BI, na BI Conference Brasil! Que será realizada no dia 26/05 em São Paulo!

O título da palestra será: “Implementando análises e relatórios com Power Pivot e Reporting Services”. Show né?

Não sei ainda se será um evento aberto ou não, mas assim que souber posto detalhes!

--

E por fim mas não menos importante: Ontem obtive mais uma certificação para o meu currículo! Agora sou MCITP Database Developer 2008.

A prova teve algumas questões triviais (se conhecer sobre é fácil) e algumas que realmente me fizeram queimar massa cinzenta, mas no final deu tudo certo!

Grande abraço,
Thiago Zavaschi

8Apr/100

PowerPivot – Fix quanto a Expiração do CTP3

Já foi lançado uma nova versão do build de novembro mas com data de expiração no final do ano.

Links para baixar:

Link com maiores informações: http://blogs.msdn.com/powerpivot/archive/2010/04/07/fix-for-powerpivot-expiration-released.aspx

Abraços,
Thiago Zavaschi

5Apr/102

PowerPivot – Expiração em 01/04/2010 – CTP3

Pessoal,

Post rápido hoje. Quem está utilizando o PowerPivot CTP 3 (CTP de novembro) percebeu que o mesmo expirou dia primeiro de abril (e não era pegadinha hehe :-).

O time deles irá disponibilizar a mesma build (de novembro) só que com data de expiração maior em breve. Enquanto isso a solução temporária é voltar a data do seu relógio para uma anterior ao dia 01/04.

Fiquem atentos ao twitter oficial (@powerpivot) e ao site (www.powerpivot.com) para novidades de lançamento da nova build. E claro, postarei aqui também assim que souber de novidades.

Abraços,
Thiago Zavaschi

11Mar/100

PowerPivot – Múltiplas Fontes de Dados

Olá pessoal!

Depois de um tempo parado devido a outros projetos pessoais, retorno ao blog. :)

O post de hoje será para mostrar um recurso muito interessante do PowerPivot for Excel que é a capacidade de utilização de mais de uma fonte de dados para compor as suas PivotTables e PivotCharts.

Vou omitir diversos passos da criação da nossa “aplicação” (arquivo .xlsx) do PowerPivot, pois já comentei os passos básicos e requisitos necessários aqui (em português) e aqui (em inglês).

Imagine que você tenha a seguinte tabela no seu SQL Server (vou limitar a poucos dados para efeito de simplificação).

Nome da tabela: Vendas

Contém 3 colunas:

  • id (identificador, int identity),
  • unidades (numero de unidades vendidas, numeric(10,2))
  • estado (estado em que foi realizada a venda, char(2)).

E os seguintes dados:

id          unidades                                estado
----------- --------------------------------------- ------
1           100.00                                  PR
2           137.00                                  SP
3           10.00                                   AC
4           50.00                                   PR
5           29.67                                   RJ
6           100.00                                  SC
7           1000.00                                 RO
8           10506.09                                SP

Valores simples indicando a quantidade vendida em cada venda e para qual estado foi feita aquela venda.

Um result set semelhante a este poderia estar vindo de uma DW que armazene os dados de vendas e você esteja interessado em saber a quantidade vendida em cada região para análise. Desta forma não seria necessário trazer outras informações relativas (talvez uma data em que a venda foi realizada, mas por motivos de simplicidade não criei esta coluna).

Percebam analisando os dados que não temos uma linha para cada estado. Podemos ter diversas. O que é um cenário muito comum.

Agora no Excel eu abri a janela do PowerPivot e importei os dados utilizando como fonte o SQL Server. Obtive o seguinte resultado:

fig1

Agora criei um PivotChart e uma PivotTable com estes dados, além de um slicer sobre estado. O motivo do slicer é facilitar a análise, por exemplo, ignorando os outliers como São Paulo e Rondônia que complicam a visualização dos demais dados. Para um slicer funcionar/filtrar basta clicar sobre ele, utilize o Ctrl para selecionar mais de um. Obtive o seguinte resultado:

fig2

Beleza Thiago, acontece que eu queria mostrar o nome completo do estado e não a sigla. Vou ter que mudar a minha fonte de dados?

Você até poderia mudar a fonte de dados, mas isso em 99,9% dos cenários reais é inviável.

Então o que fazer?

Imagine que você tenha uma planilha do Excel (estou utilizando o Excel como sendo uma segunda fonte, mas poderia ser qualquer uma das outras fontes mostradas no artigo anterior) como esta (não coloquei todos os estados do Brasil apenas para ficar um conjunto menor) apresentada a seguir.

A planilha pode ser estar dentro do .xlsx que contém o Pivot recém criado ou pode estar em uma planilha diferente. Aqui estou utilizando dentro do mesmo arquivo .xlsx.

Ponto importante:

A forma com que os dados serão importados para a sua base do PowerPivot vindos do Excel é diferente se os dados estarão na mesma planilha ou em outra.

Caso esteja em outra planilha: Abra a janela do PowerPivot >> From Files >> From Excel.

Caso esteja no mesmo .xlsx: Você deve criar uma Linked Table. Há um botão para isso na aba do PowerPivot na ribbon do Excel. Lembre-se de usar a opção de “Format as a Table” para transformar os dados no seu Excel em tabela. As imagens a seguir mostram os pontos que você deve se ater:

fig3

fig4

Após isto, a sua tabela no Excel foi incluída como fonte no PowerPivot e ficou um ícone (ao lado do nome da fonte) que indica que é uma Linked Table. O resultado é o seguinte:

fig5

Perceba que eu renomeei do nome padrão que foi criado de “Table1” para “Estados”. Para este artigo não sentiremos diferença, mas no próximo quando começarmos a analisar as DAX (Data Analysis eXpressions) vamos sentir a diferença quando formos nos referir aos nossos dados. :)

E ae pronto?

Ainda não, para obtermos o resultado desejado devemos “linkar” a coluna estado da fonte Vendas, com a coluna Sigla da linked table Estados.

Selecione a aba “Table” na janela do PowerPivot e entre na opção “Create a Relationship”.

fig6

Selecione as colunas e tabelas relacionadas da seguinte forma (atente para o sentido da ligação, a tabela para ser executado o Lookup é a Estados e não a de Vendas):

fig7

Retorne ao Excel e verifique que há um aviso sobre modificações no modelo e um botão para atualização:

fig8

Clique em atualizar e o resultado será:

fig9

Troque na região do Axis Field o campo “estado” de Vendas e troque para o “Estado” da tabela Estados. E teremos…

fig10

E pronto! Troquei (para o PivotChart) a label e isso proveniente de uma tabela no meu Excel! Poderia ser de qualquer outra fonte :). Repare que os slicers foram mantidos por sigla e continuam totalmente funcionais (poderia ter trocado pela coluna de Estado da tabela Estados também, sem problemas)!

No próximo artigo da série iniciaremos com DAX, aguardem!

Abraços,
Thiago Zavaschi