Compartilhar via


SUMMARIZECOLUMNS

Aplica-se a: Coluna calculada Tabela calculada Medida Cálculo visual

Retorna uma tabela de resumo por um conjunto de grupos.

Sintaxe

SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)  

Parâmetros

Termo Definição
groupBy_columnName Uma referência de coluna totalmente qualificada (Tabela[Coluna]) para uma tabela de base para a qual os valores distintos são incluídos na tabela retornada. Cada coluna de groupBy_columnName é unida de forma cruzada (tabelas diferentes) ou de existência automática (na mesma tabela) com as colunas especificadas posteriores.
filterTable Uma expressão de tabela que é adicionada ao contexto de filtro de todas as colunas especificadas como argumentos de groupBy_columnName. Os valores presentes na tabela de filtro são usados para filtrar antes que a junção cruzada/existência automática seja executada.
Nome Uma cadeia de caracteres que representa o nome da coluna a ser usada para a expressão posterior especificada.
expressão Qualquer expressão DAX que retorna um único valor (não é uma tabela).

Valor retornado

Uma tabela que inclui combinações de valores das colunas fornecidas, com base no agrupamento especificado. Somente linhas para as quais pelo menos uma das expressões fornecidas retorna um valor não em branco são incluídas na tabela retornada. Se todas as expressões forem avaliadas como em branco/nulo para uma linha, essa linha não será incluída na tabela retornada.

Comentários

  • Essa função não garante nenhuma ordem de classificação para os resultados.

  • Não é possível especificar uma coluna mais de uma vez no parâmetro groupBy_columnName. Por exemplo, a fórmula a seguir é inválida.

    SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )

  • Não há suporte para a função ser usada no modo DirectQuery quando usada em regras RLS (segurança em nível de linha) ou colunas calculadas.

Contexto de filtro

Considere a consulta a seguir:

SUMMARIZECOLUMNS ( 
    'Sales Territory'[Category], 
    FILTER('Customer', 'Customer' [First Name] = "Alicia") 
)

Nessa consulta, sem uma medida, as colunas groupBy não contêm nenhuma coluna da expressão FILTER (por exemplo, da tabela Customer). O filtro não é aplicado às colunas groupBy. As tabelas Sales Territory e Customer podem estar indiretamente relacionadas por meio da tabela de fatos Reseller sales. Como elas não estão diretamente relacionadas, a expressão de filtro não é operacional e as colunas groupBy não são afetadas.

No entanto, com esta consulta:

SUMMARIZECOLUMNS ( 
    'Sales Territory'[Category], 'Customer' [Education], 
    FILTER('Customer', 'Customer'[First Name] = "Alicia") 
)

As colunas groupBy contêm uma coluna que é afetada pelo filtro e esse filtro é aplicado aos resultados de groupBy.

Com IGNORE

A sintaxe IGNORE pode ser usada para modificar o comportamento da função SUMMARIZECOLUMNS omitindo expressões específicas da avaliação BLANK/NULL. As linhas para as quais todas as expressões que não usam IGNORE retornam BLANK/NULL serão excluídas, quer as expressões que usam IGNORE sejam avaliadas como BLANK/NULL ou não. IGNORE pode ser usada somente dentro de uma expressão SUMMARIZECOLUMNS.

Exemplo

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Total Qty", 
    IGNORE( SUM( Sales[Qty] ) ), 
    "BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 ) 
)

Isso acumula a coluna Sales[CustomerId], criando um subtotal para todos os clientes no agrupamento determinado. Sem IGNORE, o resultado é:

CustomerId Total Qty BlankIfTotalQtyIsNot3
Um 5
B 3 3
C 3 3

Com IGNORE,

CustomerId Total Qty BlankIfTotalQtyIsNot3
B 3 3
C 3 3

Toda a expressão ignorada,

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Blank", 
    IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5", 
    IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) ) 
)

Embora ambas as expressões retornem um valor em branco para algumas linhas, elas são incluídas, já que não há nenhuma expressão não ignorada que retorne em branco.

CustomerId Em branco: BlankIfTotalQtyIsNot5
Um 5
B
C

Com NONVISUAL

A função NONVISUAL marca que um filtro de valor na função SUMMARIZECOLUMNS não afeta os valores da medida, mas aplica-se apenas às colunas groupBy. NONVISUAL pode ser usada somente dentro de uma expressão SUMMARIZECOLUMNS.

Exemplo

DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
    DimDate[CalendarYear],
    NONVISUAL(TREATAS({2007, 2008}, DimDate[CalendarYear])),
    "Sales", [Sales],
    "Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]

Retorna o resultado em que [Vendas Totais Visuais] é o total em todos os anos:

DimDate[CalendarYear] [Vendas] [Vendas Totais Visuais]
2007 9.791.060,30 29.358.677,22
2008 9.770.899,74 29.358.677,22

Por outro lado, a mesma consulta sem a função NONVISUAL:

DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
    DimDate[CalendarYear],
    TREATAS({2007, 2008}, DimDate[CalendarYear]),
    "Sales", [Sales],
    "Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]

Retorna o resultado em que [Vendas Totais Visuais] é o total nos dois anos selecionados:

DimDate[CalendarYear] [Vendas] [Vendas Totais Visuais]
2007 9.791.060,30 19.561.960,04
2008 9.770.899,74 19.561.960,04

Com ROLLUPADDISSUBTOTAL

A adição da sintaxe ROLLUPADDISSUBTOTAL modifica o comportamento da função SUMMARIZECOUMNS adicionando linhas de acúmulo/subtotal ao resultado com base nas colunas groupBy_columnName. ROLLUPADDISSUBTOTAL pode ser usada somente dentro de uma expressão SUMMARIZECOLUMNS.

Exemplo com apenas um subtotal

DEFINE
VAR vCategoryFilter =
  TREATAS({"Accessories", "Clothing"}, Product[Category])
VAR vSubcategoryFilter = 
  TREATAS({"Bike Racks", "Mountain Bikes"}, Product[Subcategory])
EVALUATE
  SUMMARIZECOLUMNS
  (
    ROLLUPADDISSUBTOTAL
    (
      Product[Category], "IsCategorySubtotal", vCategoryFilter,
      Product[Subcategory], "IsSubcategorySubtotal", vSubcategoryFilter
    ),
    "Total Qty", SUM(Sales[Qty])
  )
  ORDER BY
  [IsCategorySubtotal] DESC, [Category],
  [IsSubcategorySubtotal] DESC, [Subcategory]

Retorna a tabela a seguir,

Categoria Subcategoria IsCategorySubtotal IsSubcategorySubtotal Total Qty
True verdadeiro 60398
Acessórios Falso verdadeiro 36092
Acessórios Racks de bicicleta Falso Falso 328
Bikes Mountain bikes Falso Falso 4970
Clothing Falso verdadeiro 9101

Exemplo com vários subtotais

SUMMARIZECOLUMNS ( 
    Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ), 
    ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] ) 
)

As vendas são agrupadas por estado, por cliente, por data, com subtotais para 1. Vendas por estado, por data 2. Vendas por estado, por cliente 3. Acumulado tanto no cliente quanto na data que levam às vendas por estado.

Retorna a tabela a seguir,

CustomerID IsCustomerSubtotal Estado Total Qty Data IsDateSubtotal
Um FALSE WA 5 10/7/2014
B FALSE WA 1 10/7/2014
B FALSE WA 2 11/7/2014
C FALSE OU 2 10/7/2014
C FALSE OU 1 11/7/2014
TRUE WA 6 10/7/2014
TRUE WA 2 11/7/2014
TRUE OU 2 10/7/2014
TRUE OU 1 11/7/2014
Um FALSE WA 5 TRUE
B FALSE WA 3 TRUE
C FALSE OU 3 TRUE
TRUE WA 8 TRUE
TRUE OU 3 TRUE

Com ROLLUPGROUP

Assim como com a função SUMMARIZE, ROLLUPGROUP pode ser usado com ROLLUPADDISSUBTOTAL para especificar quais grupos/granularidades de resumo (subtotais) incluir, reduzindo o número de linhas de subtotal retornadas. ROLLUPGROUP pode ser usada apenas dentro de uma expressão SUMMARIZECOLUMNS ou SUMMARIZE.

Exemplo com vários subtotais

SUMMARIZECOLUMNS( 
    ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ), 
    ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] ) 
)

Ainda agrupados por City e State, mas acumulados ao relatar um subtotal, retornando a tabela a seguir,

Estado CustomerId IsCustomerSubtotal Total Qty City IsCityStateSubtotal
WA Um FALSE 2 Bellevue FALSE
WA B FALSE 2 Bellevue FALSE
WA Um FALSE 3 Redmond FALSE
WA B FALSE 1 Redmond FALSE
OU C FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Redmond FALSE
OU TRUE 3 Portland FALSE
Um FALSE 5 FALSO
B FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

SummarizeColumns contextual

Tela de fundo

Até fevereiro de 2023, SUMMARIZECOLUMNS não dava suporte à avaliação em uma transição de contexto. Em produtos lançados antes desse mês, essa limitação tornou SUMMARIZECOLUMNS inútil na maioria das medidas – não foi possível chamar uma medida SUMMARIZECOLUMNS em qualquer caso de transição de contexto, incluindo outras instruções SUMMARIZECOLUMNS.

A partir de fevereiro de 2023, a transição de contexto tinha suporte em alguns cenários, mas não em todas as condições. Os casos com suporte e restritos são os seguintes:

Tipo SummarizeColumns Filtro Externo com coluna única Filtro Externo com mais de uma coluna Colunas GroupBy externas
SummarizeColumns somente com GroupBy OK OK OK
SummarizeColumns com filtros/medidas OK ERROR ERROR

A partir de junho de 2024, estamos habilitando o SummarizeColumns contextual, que permite que SummarizeColumns seja avaliado em qualquer transição de contexto, o SummarizeColumns na medida agora tem suporte total:

Tipo SummarizeColumns Filtro Externo com coluna única Filtro Externo com mais de uma coluna Colunas GroupBy externas
SummarizeColumns somente com GroupBy OK OK OK
SummarizeColumns com filtros/medidas OK OK OK

No entanto, esta atualização também inclui alterações no comportamento de SummarizeColumns, que podem alterar os resultados das expressões existentes:

Semântica SelfValue para filtros externos

Estamos introduzindo um conceito semântico chamado SelfValue, que altera como os filtros de tabelas externas interagem com colunas GroupBy em SummarizeColumns. Esta alteração não permite que filtros de uma tabela diferente afetem as colunas GroupBy, mesmo que as tabelas estejam relacionadas por meio de uma relação filtrada. Um exemplo que ilustra o impacto desta alteração envolve a seguinte expressão:

CalculateTable(
  SummarizeColumns(
      'Reseller Sales'[ResellerKey], 
      'Reseller Sales'[ProductKey]
  ), 
  Treatas({(229)}, 'Product'[Product Key])
)

Antes desta atualização, o filtro TreatAs se aplicaria à operação GroupBy em SummarizeColumns, aproveitando a relação entre "Produto"[Product Key] e "Vendas do Revendedor"[ProductKey]. Consequentemente, os resultados da consulta incluem apenas linhas em que "Vendas do Revendedor"[ProductKey] é igual a 229. No entanto, após a atualização, as colunas GroupBy em SummarizeColumns não serão mais filtradas por colunas de tabelas externas, mesmo se houver uma relação entre elas. Portanto, no exemplo acima, a coluna GroupBy "Vendas do Revendedor"[ProductKey] não será filtrada pela coluna "Produto"[ProductKey]. Como resultado, a consulta incluirá linhas em que "Vendas do Revendedor"[ProductKey] não seja igual a 229.

Se preferir manter o comportamento anterior, você poderá reescrever a expressão usando AddColumns ou SelectColumns em vez de SummarizeColumns, conforme mostrado abaixo:

CalculateTable(
    Filter(
        SelectColumns(
            'Reseller Sales',
            "ResellerKey", 
            [ResellerKey],
            "ProductKey",
            [ProductKey]
        ),
        And(Not IsBlank([ResellerKey]),  Not IsBlank([ProductKey]))
    ),
    Treatas({(229)}, 'Product'[Product Key])
)

Esta expressão reescrita preserva a semântica original, em que a operação GroupBy não é afetada pela restrição SelfValue introduzida pela atualização.

Validação de linha para colunas groupby totalmente cobertas por Treatas

Antes desta atualização, dentro de uma função SummarizeColumns, se todas as colunas GroupBy de uma tabela específica fossem totalmente cobertas por um único filtro Treatas da mesma tabela, conforme mostrado abaixo:

SummarizeColumns(
  Geography[Country], 
  Geography[State], 
  Treatas(
      {("United States", "Alberta")}, 
      Geography[Country], 
      Geography[State]
  )
)

O resultado da consulta acima incluiria quaisquer linhas especificadas no filtro Treatas, independentemente de serem válidas ou não. Por exemplo, o resultado seria uma tabela de linha única ("Estados Unidos", "Alberta"), mesmo que não exista tal linha com [País] = "Estados Unidos" e [Estado] = "Alberta" na tabela "Geografia".

Esse problema era conhecido e foi resolvido pela atualização. Após a atualização, essas linhas inválidas são filtradas e somente as linhas válidas da tabela GroupBy são retornadas. Portanto, o resultado da consulta acima estaria vazio, pois não há linhas válidas que correspondam aos valores [País] e [Estado] especificados na tabela "Geografia".

Não permitir Keepfilters/overriddefilters mistos na mesma tabela/cluster

A atualização recente introduziu uma restrição temporária que dispara uma mensagem de erro informando:

"SummarizeColumns filters with keepfilters behavior and overridefilters behavior are mixed within one cluster, which is not allowed. Consider adding keepfilters() to all filters of summarizecolumns." 

Este erro ocorre quando filtros normais (que substituem filtros existentes) e filtros com KeepFilters especificados estão presentes na mesma tabela/cluster. Por exemplo:

Evaluate CalculateTable(
  SummarizeColumns(
      Product[Color],
      KeepFilters(
          TreatAs(
              {( "Washington")}
              , Geography[State]
          )
      ),
      TreatAs(
          {("United States"), ("Canada")}
          , Geography[Country]
      )
  )
  ,TreatAs({("Alberta")}, Geography[State])
  ,TreatAs({("Canada")}, Geography[Country])
)

Na expressão acima, há dois filtros na tabela "Geografia": um com KeepFilters especificado e outro sem. Esses filtros se sobrepõem com filtros externos em colunas diferentes. Atualmente, esta configuração não é permitida porque, internamente, os dois filtros são clusterizados em um e o sistema não pode determinar o comportamento correto de substituição de filtro para o filtro clusterizado em geral nesses casos.

Observe que essa restrição é temporária. Estamos desenvolvendo ativamente soluções para remover essa limitação em atualizações futuras. Se você encontrar esse erro, aconselhamos ajustar os filtros em SummarizeColumns adicionando ou removendo KeepFilters conforme necessário para garantir um comportamento de substituição consistente em cada tabela.

SUMMARIZE