quinta-feira, 28 de março de 2019

Dimensão com Hierarquia Auto-referenciada - Parent-Child

Uma dimensão do tipo parent-child implementa o conceito auto-referenciamento de uma árvore desbalanceada, ou seja, possui ramos com tamanhos diferentes dependendo da profundidade de cada encadeamento.

Este tipo de dimensão pode aparecer em projetos que trabalham com listas de materiais que possuem subcomponentes, em sistemas corporativos que organizam os recursos humanos em estrutura organizacionais, em contas contábeis, etc..

Os projetos criados com o modelo tradicional do analysis services multidimensional (MDX) já possuem uma configuração nativa para tratar este tipo de dimensão, basta configurar corretamente as propriedades para que funcione.

Configuração das propriedades da dimensão





























Visualizando a dimensão
















Porém, com modelos tabulares criados com DAX esse suporte nativo não existe. Para obter uma hierarquia navegável no modelo de dados, você precisa decompor os níveis até um determinado ponto para obter uma hierarquia pai-filho.

Para isso o DAX fornece funções específicas para trabalhar com uma hierarquia pai-filho usando colunas calculadas.

Hierarquias Pai-Filho em DAX


A hierarquia é implementada utilizando as funções do grupo PATH.

PATH

PATHCONTAINS

PATHITEM

PATHITEMREVERSE

PATHLENGTH


Dados de Exemplo: Este exemplo será feito com base nesta tabela, onde o código da coluna gerente é o código pai.
















1-Identificar o caminho completo: 

Utiliza a coluna Gerente para referenciar todas as relações e retornar uma string com o caminho completo com todos os níveis superiores.



















Neste exemplo, existe uma coluna com a hierarquia já criada, em algumas fontes de dados isso pode existir, se esse for o caso, o primeiro passo pode ser substituído por esta função.


















2-Descobrindo o tamanho do caminho: 

Utilizar a função PATHLENGTH para identificar o tamanho. Esse valor será útil para identificar quantos níveis devem ser criados.


















3-Criando os níveis:

Nível 1: Utilizar PARENTITEM para localizar o código do nivel 1 e fornecer o parâmetro para LOOKUPVALUE localizar o nome do profissional.

























Nível 2: A partir do nível 2 é necessário fazer uma verificação no tamanho.






























O processo se repete para quantos níveis forem necessários.

O resultado final pode ser observado em um filtro ou em uma matrix.





Fonte:
https://docs.microsoft.com/en-us/dax/parent-and-child-functions- dax
https://www.daxpatterns.com/parent-child-hierarchies/
https://docs.microsoft.com/en-us/dax/understanding-functions- for-parent-child- hierarchies-in-dax
https://www.youtube.com/watch?v=QFKTr8tAQXE&list=PLWfPHxJoa7zthSaAMlt0JkJpFeVtdHzq6&index=42



2 comentários:

  1. Muito bom o conteúdo Leandro. Estou tentando implementar o mesmo conceito de hierarquia com um plano de contas contábil de 5 níveis, onde:

    N1 - 1 dígito
    N2 - 1 dígitos
    N3 - 2 dígitos
    N4 - 2 dígitos
    N5 - 2 dígitos

    Exemplo:
    1 ATIVO
    1.1 ATIVO CIRCULANTE
    1.1.01 CAIXA E EQUIVALENTES DE CAIXA
    1.1.01.01 CAIXAS
    1.1.01.01.01 CAIXA LOJA

    No banco de dados cada conta já contém a estrutura sem a separação por PONTO. Sei que o exemplo do vídeo é bem parecido, mas estou com dificuldade em montar o mesmo cenário, creio que não preciso utilizar a PATH para determinar a hierarquia mas não tenho certeza.
    Será que você consegue fazer um exemplo com este cenário?

    Abraço

    ResponderExcluir
  2. Leandro, tentei essa solução para produtos que possuem vários "pais" e a função path não aceita, ex.: tenho 10 produtos pais que possui 1 mesmo subproduto filho. Sabe me dizer a solução que devo recorrer?

    ResponderExcluir