Como utilizar Agrupar Por no Power Query de forma eficaz

Tempo de leitura:

5–7 minutes

Neste artigo vou mostrar-te a ferramenta Agrupar Por [Group By] em Power Query!

Vais ficar a saber como funciona a lógica de Agrupar Dados em Power Query, que permite resumir a informação de uma Tabela em função de um ou mais campos e efetuar cálculos sobre as colunas agrupadas!

Na génese do comando está a função Table.Group e no artigo vais perceber como funciona a sintaxe da função em código M para teres mais controlo sobre os teus dados e vais aprender a utilizar os “parâmetros” e funcionalidades escondidas da ferramenta que não obténs através da interface do utilizador!

Agrupar dados: Básico

Vamos começar por aceder ao Power Query, importando os nossos dados que estão numa tabela.

Tabela de dados no Power Query com colunas de Data, Mês, Marca, Produto, Loja, Preço Unitário, Quantidade e Total.

Já no Power Query, acedemos ao menu Transformar [Transform] -> Opção Agrupar Por [Group By]. É possível também aceder ao comando no Separador Base [Home].

Interface do Power Query mostrando a ferramenta Agrupar Por, com opções para selecionar a coluna a agrupar, operação e cálculo para nova coluna.

Para agrupar temos dois métodos:

  • Básico: Apenas permite agrupar sobre uma coluna e calcular apenas uma coluna.
  • Avançado: Permite agrupar por mais do que uma coluna e calcular mais do que uma coluna.

O resultado é o esperado com uma nova tabela, agrupada por [Mês] com a soma da coluna [Total] numa nova coluna chamada “Totais”.

Imagem da tela do Power Query mostrando o código M para o comando Table.Group, com os resultados agrupados por mês e totais calculados.

Agrupar dados: Avançado

Vamos voltar a editar o grupo, para realizarmos agora um grupo Avançado.

Para criar um grupo avançado a lógica é a mesma, simplesmente temos mais opções.

Mesmo tendo mais alternativas para criar o grupo, através da interface do utilizador, estamos limitados a escolher apenas 7 funções de agregação mais a possibilidade de mostrar todas as linhas, que mostra todas as linhas do registo em questão, ou seja, uma Tabela aninhada.

Interface do Power Query mostrando a opção "Agrupar Por" com campos para definir a coluna a agrupar e as operações de agregação.

O resultado é apresentado na imagem em baixo. Nota os dados inconsistentes na Marca. O Power Query é sensível a Maiúsculas e como tal, considera a marca diferente.

Interface do Power Query mostrando dados agrupados por Mês e Marca, destacando dados inconsistentes com a nota 'Dados Inconsistentes'.

Analisar o Código M

Voltando ao cenário inicial, vamos analisar o código gerado pelo grupo simples:

= Table.Group(

    #”Tipo Alterado”,

    {“Mês”},

    {{“Totais”, each List.Sum([Total]), type nullable number}})

A Função Table.Group é definida por:

  1. table as table
  2. key as any
  3. aggregatedColumns as list
  4. groupKind as type
  5. comparer as function

Destes argumentos os primeiros 3 são obrigatórios e os restantes são opcionais. Os 3 primeiros são os que estão disponíveis pela interface do utilizador.

Simplificando a sintaxe a função apenas necessita de:

  1. Tabela -> normalmente é o resultado do passo anterior
  2. Key -> A coluna ou colunas usadas para agrupar
  3. aggregatedColumns -> A(s) coluna(s) a agregar sobre a forma de uma lista com 3 elementos:
    1. Nome da Coluna a agregar
    1. Função para agregar
    1. Tipo de dados do resultado da Coluna

Vamos criar uma referência da Tabela para voltarmos a ter os dados originais e trabalhar a função Table.Group a partir daí. (Na consulta original removemos o passo do grupo para obtermos os dados originais).

Screenshot da interface do Power Query mostrando a tabela de dados e a referência ao comando Table.Group.

No Editor Avançado definimos o código para a nossa função Table.Group.

let

    Origem = Dados,

    GrupoM = Table.Group (

        Origem,

        {“Mês”},

        {

            {“Totais”, each List.Sum([Total]), type number}

        }

    )

in

    GrupoM

Screenshot do editor do Power Query mostrando a função Table.Group em uso, com um exemplo de agrupamento de dados por Mês e a soma de uma coluna chamada Totais.

Realizar outros cálculos com código M

Como foi possível verificar no exemplo, a interface do utilizador apenas permite realizar um número limitado de cálculos (Agregações).

Contudo através do código M podemos realizar qualquer operação, mesmo que não seja uma agregação.

Através do código podemos também adicionar novas colunas, seguindo o princípio de manter a lista { a.           Nome da Coluna a agregar, b. Função para agregar, c. Tipo de dados do resultado da Coluna}

let

    Source = Dados,

    GrupoM = Table.Group(

        Source,

        {“Mês”},

        {

            {“Total de Produtos”, each List.Count([Produto]), type nullable number},

            {“Produtos Únicos”, each Text.Combine(List.Distinct([Produto]), “#(cr)”), type text}

        }

    )

in

    GrupoM

Captura de tela do Editor Avançado no Power Query, mostrando o código para a função Table.Group e os resultados da agregação de dados por mês e produtos.

Opção Group.Kind

Através do código M é possível também definir o próximo argumento da função que permite definir a forma como o critério do grupo é definido.

  • GroupKind.Global: Esta é a opção pré-definida e coloca no mesmo grupo todas as linhas que contêm o mesmo valor. Para esta opção é possível colocar o valor 1 em vez de GroupKind.Global ou deixar o argumento em branco.
    • Atenção que o Power Query considera linhas com o mesmo valor considerando as maiúsculas e minúsculas.
  • GroupKind.Local: Esta é a opção que permite criar um grupo de linhas consecutivas com o mesmo valor.

let

    Source = Dados,

    GrupoM = Table.Group(

        Source,

        {“Marca”},

        {

            {“Total de Produtos”, each List.Count([Produto]), type nullable number}

        },

        GroupKind.Global

    )

in

    GrupoM

Captura de tela do Power Query mostrando a função Table.Group sendo usada para agrupar dados por Marca e contar o Total de Produtos.

Adicionar o comparador

Ainda dentro deste raciocínio, vamos acrescentar já o último argumento: comparer onde podemos definir a forma como a função compara os valores.

Screenshot showing the Power Query editor with the Table.Group function being utilized, including the code for grouping data by 'Marca' and counting 'Total de Produtos'.

Colocando a opção Comparer.OrdinalIgnoreCase em conjunto com a opção anterior GroupKind.Global o grupo é formado com todas as linhas que contêm o mesmo valor e mesmo que as capitulares sejam diferentes, são consideradas o mesmo valor.

let

    Source = Dados,

    GrupoM = Table.Group(

        Source,

        {“Marca”},

        {

            {“Total de Produtos”, each List.Count([Produto]), type nullable number}

        },

        GroupKind.Global,

        Comparer.OrdinalIgnoreCase

    )

in

    GrupoM

GroupKind.Local

Contudo se pretendemos agrupar por linhas consecutivas de acordo com a ordem da coluna na tabela de dados, devemos colocar a opção GroupKind.Local.

Captura de tela mostrando a interface do Power Query com dados agrupados por 'Marca' e total de produtos. O painel de edição avançada exibe o código M utilizado para a função Table.Group.

let

    Source = Dados,

    GrupoM = Table.Group(

        Source,

        {“Marca”},

        {

            {“Total de Produtos”, each List.Count([Produto]), type nullable number}

        },

        GroupKind.Local,

        Comparer.OrdinalIgnoreCase

    )

in

    GrupoM

Agrupar dados criando Tabelas Aninhadas

Vamos agora criar um Grupo, onde vamos usar a Agregação -> Todas as linhas e alterar o código de seguida.

Interface do Power Query mostrando a funcionalidade 'Agrupar Por', com informações sobre colunas e operações.

A imagem em baixo mostra o código formatado com o resultado do Grupo.

Screenshot of Power Query showing the Advanced Editor with a M code snippet for grouping data by month and creating a nested table.

Na parte da coluna mostro especial atenção para a parte da operação com a Função para agregar que tem a opção each _ que representa a tabela gerada.

Nesta parte podemos realizar uma operação que afeta a tabela interna.

Por exemplo podemos adicionar uma coluna de índice em cada uma das Tabelas internas.

Tela do Editor Avançado no Power Query mostrando um código M para agrupar dados com uma coluna de índice adicionada em tabelas internas.

let

    Origem = Dados,

    GrupoT = Table.Group(

        Origem,

        {“Mês”},

        {

            {“Detalhes”,

                each Table.AddIndexColumn(_, “Índice”, 1),

                type table [

                    Data=nullable datetime,

                    Mês=nullable text,

                    Marca=nullable text,

                    Produto=nullable text,

                    Loja=nullable text,

                    Preco_Un=nullable number,

                    Quantidade=nullable number,

                    Total=nullable number]

            }

        }

    )

in

    GrupoT

O resultado é o esperado com uma nova coluna em cada uma das tabelas internas (Aninhadas).

Captura de tela do Power Query mostrando o resultado da função Table.Group, agrupando dados por mês, com detalhes e uma coluna de índice.

Expandir as Tabelas em função do Grupo

O passo natural seguinte é expandir as Tabelas internas para criar uma Tabela Global. Contudo se fizermos este passo, o código gerado é estático e as colunas são definidas de forma explicita, o que não permite que o resultado seja dinâmico.

Captura de tela do Editor do Power Query mostrando a função Table.Group sendo utilizada para expandir colunas de uma tabela agrupada.

O resultado é definido com as colunas nomeadas com valores estáticos, que impede de alterar a estrutura da Tabela de base e manter o código funcional.

Tela do Editor Avançado em Power Query mostrando o código M para a função Table.Group e a estrutura de uma tabela com nomes de colunas estáticos.

Para que o resultado seja sempre dinâmico, vamos retirar a opção de Expandir as colunas previamente gerado e vamos adicionar um novo passo na nossa consulta.

CombinarTabelas = Table.Combine(GrupoT[Detalhes])

No novo passo vamos usar a função Table.Combine, onde vamos usar a coluna “Detalhes” que contem as Tabelas internas. Assim podemos combinar todas as tabelas numa única sem mexer nos nomes das colunas.

Qualquer alteração feita nas Tabelas internas ou mesmo na Tabela de Base não vai afetar este passo!

Imagem do editor Power Query mostrando a função Table.Group configurada para agrupar dados por mês, com uma coluna chamada 'Detalhes' que reúne tabelas internas e uma operação de combinação de tabelas utilizando Table.Combine.

Próximo artigo:

Artigo Anterior:


Comments

Leave a Reply

Discover more from Exceldriven

Subscribe now to keep reading and get access to the full archive.

Continue reading