Many to Many no SSAS 2016 Tabular

By | 11/04/2016

Olá pessoal. Hoje vou comentar sobre uma das novas features do Analysis Services 2016: Suporte a relacionamentos bi-direcionais. Isso resolve o problema dos cenários M:N (many to many) para os modelos tabulares.

Até o SSAS 2016 (tabular) a propagação do filtro ocorria sempre em um único sentido (1 (one) –> * (many)), então para fitrar o contexto na fato isso era trivial. Contudo, para filtrar uma segunda dimensão baseado no filtro da primeira dimensão isso não era possível (sem lançar mão de algumas funções DAX realtivamente complicadas). Acompanhe o exemplo abaixo. Estou utilizando o Analysis Services 2016 Release Candidate 2.

image

Na figura acima temos um pedaço de um modelo. Observe os relacionamentos entre as tabelas: DimProductCategory, DimProductSubcategory, DimProduct e FactInternetSales.
Veja que a direção “one to many” vai até a fato. Isso significa que os filtros realizados em DimProductCategory, DimProductSubcategory e DimProduct são propagados e refletidos nos cálculos das medidas presentes na tabela FactInternetSales.

Imagine que FactInternetSales contém a seguinte medida: Sales := SUM(SalesAmount). Ao consumir o modelo percebemos que os filtros realizados nas dimensões de Produto são refletidos nesta medida. Este é o comportamento tradicional até o Tabular 2014. Abaixo temos um exemplo do consumo:

image

Até aqui tranquilo. Mas imagine que queremos contar a quantidade de clientes únicos que realizaram compras, como sendo uma nova coluna na pivot table acima. Bom, parece simples né? Basta adicionar a seguinte medida em DimCustomer: UniqueCustomers := DISTINCTCOUNT([CustomerKey]).

Vamos testar?

image

O resultado desta nova measure não foi afetado pelo fitro realizado em Categoria (e em CalendarYear), pois o fitro não se propaga (neste cenário) no sentido many to one.

Para resolver isso o SSAS Tabular 2016 implementou o que chamamos de filtros bi-direcionais oq ue permite o filtro se propagar em ambos os sentidos. O ideal é ativar este recurso aos poucos, principalmente para modelos bastante complexos, para evitar um filtro excessivo e te levar a resultados não esperados.

Para ativar o recurso, basta clicar com o botão direito sobre o relacionamento e marcar o filtro em ambas as direções. Isso vai possibilitar a propagação do filtro.

image

Vamos testar novalemtne a nossa medida UniqueCustomers para verificar se o filtro está sendo propagado (* to 1)?

image

Perceba que o valor plotado anteriormente (18484) é o valor total, mas agora que é afetado pelo filtro em ambos os sentidos (FactInternetSales <-> DimCustomer) temos o resultado correto.

Antes do SSAS 2016 era possível simular este comportamente utilizando DAX, mas não era uma forma trivial ou fácil de implementar.

Espero que tenham gostado!

Dúvidas ou sugestões? Deixe um comentário!

Abraços,
Zava

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *