Utilizando o comando SUMMARIZECOLUMNS

Este artigo explica como usar o SUMMARIZECOLUMNS, que é uma substituição do SUMMARIZE e não requer o uso do ADDCOLUMNS para obter um bom desempenho.

A função SUMMARIZECOLUMNS ainda não é totalmente suportada em um contexto de filtro modificado. Por exemplo, não pode ser usado dentro de uma medida em uma expressão de ADDCOLUMNS. Por favor, avalie se o SUMMARIZE pode trabalhar em todas as condições que você deseja suportar antes de usá-lo em uma medida.

A função DAX que agrega e agrupa dados que aproveita os relacionamentos existentes é SUMMARIZE.  Essa função requer uma tabela no primeiro argumento, que corresponde à tabela agrupada.  Você pode incluir colunas em outras tabelas relacionadas, se houver um ou mais relacionamentos muitos-para-um para chegar as tabelas referenciadas. Por exemplo, você pode escrever a seguinte sintaxe para recuperar uma tabela com ano, cor e quantidade de vendas:

Sales by Year and Color =
SUMMARIZE (
Sales,
'Date'[Calendar Year],
'Product'[Color],
"Sales Amount", SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
)

Essa consulta retorna uma tabela, que está como uma tabela calculada no exemplo do Power BI que você pode baixar.

O SUMMARIZE é que ele tem várias problemas de desempenho, e para manter a compatibilidade, a Microsoft não pode corrigir por completo.  Por esse motivo, você deve evitar de escrever o código anterior.  Em vez disso, você deve usar o SUMMARIZE apenas para obter a lista de anos e cores únicos para os quais há pelo menos uma linha na tabela de vendas, adicionando qualquer expressão de agregação usando ADDCOLUMNS, como no exemplo a seguir:

 

Sales by Year and Color optimized = 
ADDCOLUMNS (
    SUMMARIZE (
        Sales, 
        'Date'[Calendar Year], 
        'Product'[Color]
    ), 
    "Sales Amount", CALCULATE ( SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] ) )
)

Note que com ADDCOLUMNS você deve adicionar uma instrução CALCULATE para aplicar uma transição de contexto, enquanto isso não é necessário em SUMMARIZE.

Se você usa o Power BI, o Analysis Services 2016 ou o Excel 2016 (*), você pode usar uma nova função DAX chamada SUMMARIZECOLUMNS, que aparentemente é apenas uma substituição do SUMMARIZE. Na realidade, ele fornece alguns recursos adicionais. A sintaxe SUMMARIZE inicial pode ser escrita usando SUMMARIZECOLUMNS sem especificar a tabela a agrupar, como no exemplo a seguir:

Sales by Year and Color new style = 
SUMMARIZECOLUMNS (
    'Date'[Calendar Year], 
    'Product'[Color], 
    "Sales Amount", SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
)

Como você vê, você não especifica mais a tabela de vendas nos argumentos SUMMARIZECOLUMNS.
Porque isso? Você pode imaginar que SUMMARIZECOLUMNS é uma versão muito otimizada do seguinte código:

Sales by Year and Color using Crossjoin = 
FILTER (
    SUMMARIZE (
        CROSSJOIN (
            VALUES ( 'Date'[Calendar Year] ),
            VALUES ( 'Product'[Color] )
        ),
        'Date'[Calendar Year],
        'Product'[Color],
        "Sales Amount", SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
    ),
    NOT ( ISBLANK ( [Sales] ) )
)

 

Se você comparar os planos de consulta das duas versões usando o DAX Studio (download no link no final do artigo), você notará que o SUMMARIZECOLUMNS é extremamente eficiente, exigindo apenas uma consulta no banco de dados e um número menor de etapas no plano de consulta física.

Em geral, você deve ser capaz de substituir SUMMARIZE pelo seu gêmeo SUMMARIZECOLUMNS, além de remover o ADDCOLUMNS / SUMMARIZE por razões de desempenho até agora.  Em regra, sugerimos substituir ADDCOLUMNS / SUMMARIZE e SUMMARIZE por SUMMARIZECOLUMNS, porque o plano de consulta resultante é mais eficiente. No entanto, há alguns detalhes que você deve considerar.

 

Filtrando tabelas com SUMMARIZECOLUMNS

A versão SUMMARIZECOLUMNS não possui o primeiro argumento especificando a tabela base para usar na operação de junção.  Nos exemplos anteriores, o motor DAX infere tal tabela da expressão de agregação que aplicamos para o Sales Amount, produzindo um resultado equivalente.  No entanto, se você não incluir nenhuma expressão, você obterá um crossjoin como resultado. Por exemplo, considere a seguinte sintaxe:

Sales by Year and Color crossjoin implicit = 
SUMMARIZECOLUMNS (
    'Date'[Calendar Year], 
    'Product'[Color]
)

Produz todas as combinações possíveis entre o ano e a cor, que são 112 no nosso exemplo (7 anos multiplicados por 16 cores) e corresponde à seguinte consulta:

Sales by Year and Color crossjoin explicit = 
CROSSJOIN (
    VALUES ( 'Date'[Calendar Year] ), 
    VALUES ( 'Product'[Color] )
)

 

Qual é a sintaxe equivalente de SUMMARIZE que retorna apenas as 47 combinações existentes de ano e cor usadas por pelo menos uma linha da tabela de vendas? É o seguinte:

 

Sales by Year and Color summarize = 
SUMMARIZE (
    Sales,
    'Date'[Calendar Year], 
    'Product'[Color]
)

Você deve especificar o argumento opcional dos filtros após as colunas que você agrega e antes de qualquer coluna calculada adicional (não presente neste caso):

Sales by Year and Color summarizecolumns = 
SUMMARIZECOLUMNS (
    'Date'[Calendar Year], 
    'Product'[Color],
    Sales
)

 

Em SUMMARIZECOLUMNS, você pode adicionar várias tabelas de filtros, o que pode ser útil para consultas aplicadas a modelos de dados complexos com múltiplas tabelas de fatos.

Não há diferenças nos planos de consulta produzidos por SUMMARIZECOLUMNS e SUMMARIZE para esses últimos exemplos. Portanto, não é necessário substituir SUMMARIZE por SUMMARIZECOLUMNS se você não usar expressões calculadas no SUMMARIZE.

 

SUMMARIZECOLUMNS em contexto de linha

 

Outra diferença entre SUMMARIZE e SUMMARIZECOLUMNS é que SUMMARIZE mantém um contexto de linha e um contexto de filtro ativo na expressão onde você especifica a agregação, enquanto SUMMARIZECOLUMNS fornece apenas um contexto de filtro e nenhum contexto de linha.

Por exemplo, você pode escrever essa expressão usando o SUMMARIZE, onde o número do ano é usado para aplicar uma correção ao valor da quantidade de vendas:

 

Sales by Year and Color correction summarize = 
SUMMARIZE (
    Sales,
    'Date'[Calendar Year Number],
    'Product'[Color],
    "Sales Amount",
    VAR delta = 'Date'[Calendar Year Number] - 2007
    VAR correction = 1 + ( delta / 100 )
    RETURN
        correction 
            * SUMX ( Sales, [Quantity] * Sales[Unit Price] )
)

Como com SUMMARIZECOLUMNS você não possui um contexto de linha para as colunas que você está agrupando, você deve usar VALUES para recuperar esse valor do contexto do filtro, supondo que você tenha apenas um valor ativo se você não estiver avaliando a expressão em um pacote cumulativo:

 

Sales by Year and Color correction summarizecolumns = 
SUMMARIZECOLUMNS (
    'Date'[Calendar Year Number],
    'Product'[Color],
    "Sales Amount",
    VAR delta = VALUES ( 'Date'[Calendar Year Number] ) - 2007
    VAR correction = 1 + ( delta / 100 )
    RETURN
        correction 
            * SUMX ( Sales, [Quantity] * Sales[Unit Price] )
)

Caso você tenha um rollup ativo no SUMMARIZECOLUMNS, então você deve considerar que haverá vários valores no contexto do filtro. Nesse caso, é necessário verificar a presença de múltiplos valores usando HASONEVALUE antes de chamar VALUES.

Sales by Year and Color correction summarizecolumns with subtotals = 
SUMMARIZECOLUMNS (
    ROLLUPADDISSUBTOTAL ( 'Date'[Calendar Year Number], "All Years" ),
    'Product'[Color],
    "Sales Amount",
    VAR delta =
        IF (
            HASONEVALUE ( 'Date'[Calendar Year Number] ),
            VALUES ( 'Date'[Calendar Year Number] ) - 2007,
            0
        )
    VAR correction = 1 + ( delta / 100 )
    RETURN
        correction
            * SUMX ( Sales, [Quantity] * Sales[Unit Price] )
)

Na captura de tela a seguir, você pode ver a coluna adicional All Years, que contém True para linhas adicionais que contêm o total de cada cor para todos os anos.

 

Conclusão

Você deve considerar a função SUMMARIZE quase como obsoleta.  O único uso seguro do SUMMARIZE é quando você não inclui expressões adicionais e usa SUMMARIZE apenas para juntar tabelas e obter um resultado equivalente a um SELECT DISTINCT do SQL.

A função SUMMARIZECOLUMNS produz um plano de consulta mais otimizado e você deve considerá-lo como um substituto para o padrão SUMMARIZE e ADDCOLUMNS / SUMMARIZE.

 

Arquivos para download

SUMMARIZECOLUMNS (2 downloads)

Deixe uma resposta

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