Partilhar via


SUMMARIZECOLUMNS

Aplica-se a:Coluna calculadaTabela calculadaMeasureCálculo visual

Retorna uma tabela de resumo sobre 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 (Table[Column]) a uma tabela base para a qual os values distintos estão incluídos na tabela retornada. Cada coluna groupBy_columnName é unida cruzadamente (tabelas diferentes) or auto-existiu (mesma tabela) com as colunas especificadas subsequentes.
filterTable Uma expressão de tabela que é adicionada ao contexto filter de all colunas especificadas como groupBy_columnName argumentos. Os values presentes na tabela filter são usados para filter antes que a junção cruzada/autoexistência seja executada.
name Uma cadeia de caracteres que representa o nome da coluna a ser usado para a expressão subsequente especificada.
expression Qualquer expressão DAX que retorna um único value (not uma tabela).

Regresso value

Uma tabela que inclui combinações de values das colunas fornecidas com base no agrupamento especificado. Somente as linhas para as quais pelo menos uma das expressões fornecidas retornam um não-blankvalue são incluídas na tabela retornada. If all expressões evaluateBLANK/NULL para uma linha, essa linha not é incluída na tabela retornada.

Observações

  • Esta função not garante qualquer ordem de classificação para os resultados.

  • Uma coluna não pode ser especificada mais de uma vez no parâmetro groupBy_columnName. Por exemplo, a fórmula a seguir é inválida.

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

  • Esta função not é suportada para uso no modo DirectQuery quando usada em colunas calculadas or regras de segurança em nível de linha (RLS).

Filter contexto

Considere a seguinte consulta:

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

Nesta consulta, sem um measure as colunas groupBynot contêm colunas da expressão FILTER (por exemplo, da tabela Cliente). O filternot é aplicado às colunas groupBy. As tabelas Território de Vendas and Cliente podem ser related indiretamente através da tabela fact de vendas do Revendedor. Como elas são not diretamente related, a expressão filter é uma no-op and as colunas groupBynot 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 pela filterand que filter é aplicada aos resultados 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 all expressões not usando IGNORE retornar BLANK/NULL serão excluídas independentemente de as expressões que usam IGNOREevaluate para BLANK/NULL ornot. IGNORE só pode ser usado 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 all clientes no agrupamento determinado. Sem IGNORE, o resultado é:

ID do Cliente Qtd total BlankIfTotalQtyIsNot3
A 5
N 3 3
C 3 3

Com IGNORE,

ID do Cliente Qtd total BlankIfTotalQtyIsNot3
N 3 3
C 3 3

All expressão ignorada,

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

Even que ambas as expressões retornem blank para algumas linhas, elas são incluídas, pois não há expressões não ignoradas que retornam blank.

ID do Cliente Blank BlankIfTotalQtyIsNot5
A 5
N
C

Com NONVISUAL

A função NONVISUAL marca um valuefilter em SUMMARIZECOLUMNS função como not afetando measurevalues, mas apenas se aplicando a groupBy colunas. NONVISUAL só pode ser usado 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]

Devolve o resultado em que [Visual Total Sales] é o total ao longo de all anos:

DimDate[Ano Calendário] [Sales] [Total Visual de Vendas]
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]

Devolve o resultado em que [Visual Total Sales] é o total nos dois anos selecionados:

DimDate[Ano Calendário] [Sales] [Total Visual de Vendas]
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 SUMMARIZECOLUMNS adicionando rolluplinhas /subtotal ao resultado com base nas colunas groupBy_columnName. ROLLUPADDISSUBTOTAL só pode ser usado dentro de uma expressão SUMMARIZECOLUMNS.

Exemplo com subtotal único

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]

Devolve a seguinte tabela,

Categoria Subcategoria IsCategorySubtotal ÉSubcategoriaSubtotal Qtd total
True True 60398
Accessories False True 36092
Accessories Suportes para bicicletas False False 328
Bikes Mountain Bikes False False 4970
Vestuário False True 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 date, com subtotais para 1. Vendas por estado, até date 2. Vendas por Estado, por Cliente 3. Acumulado em ambos os anddate do cliente levando a vendas por estado.

Devolve a seguinte tabela,

IDDeCliente IsCustomerSubtotal Estado Qtd total Date IsDateSubtotal
A FALSE WA 5 10/07/2014
N FALSE WA 1 10/07/2014
N FALSE WA 2 7/11/2014
C FALSE OR 2 10/07/2014
C FALSE OR 1 7/11/2014
TRUE WA 6 10/07/2014
TRUE WA 2 7/11/2014
TRUE OR 2 10/07/2014
TRUE OR 1 7/11/2014
A FALSE WA 5 TRUE
N FALSE WA 3 TRUE
C FALSE OR 3 TRUE
TRUE WA 8 TRUE
TRUE OR 3 TRUE

Com ROLLUPGROUP

Tal como acontece com a função SUMMARIZE, ROLLUPGROUP pode ser usada em conjunto com ROLLUPADDISSUBTOTAL para especificar quais grupos/granularidades de resumo (subtotais) incluir, reduzindo o número de linhas de subtotal retornadas. ROLLUPGROUP só pode ser usado dentro de uma expressão SUMMARIZECOLUMNSorSUMMARIZE.

Exemplo com vários subtotais

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

Ainda agrupado por Cidade and Estado, mas agrupado ao relatar um subtotal retorna a tabela a seguir,

Estado ID do Cliente IsCustomerSubtotal Qtd total City IsCityStateSubtotal
WA A FALSE 2 Bellevue FALSE
WA N FALSE 2 Bellevue FALSE
WA A FALSE 3 Redmond FALSE
WA N FALSE 1 Redmond FALSE
OR C FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Redmond FALSE
OR TRUE 3 Portland FALSE
A FALSE 5 FALSE
N FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

SummarizeColumns Contextual

Fundo

Até fevereiro de 2023, SUMMARIZECOLUMNSnot apoiava a avaliação dentro de um contexto de transição em all. Em produtos lançados antes dessa month, essa limitação SUMMARIZECOLUMNSnot tornou útil na maioria das medidas – not era possível chamar uma measureSUMMARIZECOLUMNS em qualquer caso de transição de contexto, incluindo outras SUMMARIZECOLUMNSstatements.

A partir de fevereiro de 2023, a transição de contexto foi apoiada em alguns cenários, mas not em all as condições. Os casos suportados and restritos são os seguintes:

Tipo SummarizeColumns Filter externa com coluna única Filter externas com mais de uma coluna Colunas GroupBy externas
SummarizeColumns apenas com GroupBy OK OK OK
SummarizeColumns com Filters/Medidas OK ERROR ERROR

A partir de junho de 2024, estamos habilitando SummarizeColumns contextuais que permitem que SummarizeColumns sejam avaliadas em qualquer transição de contexto, SummarizeColumns em measure é now totalmente suportado:

Tipo SummarizeColumns Filter externa com coluna única Filter externas com mais de uma coluna Colunas GroupBy externas
SummarizeColumns apenas com GroupBy OK OK OK
SummarizeColumns com Filters/Medidas OK OK OK

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

Semântica SelfValue para filters externos

Estamos introduzindo um conceito semântico chamado SelfValue, que altera como filters de tabelas externas interagem com GroupBy colunas em SummarizeColumns. Essa alteração não permite que filters de uma tabela diferente afetem as colunas GroupBy, evenif as tabelas são related por meio de uma relação filter-by. 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 TreatAsfilter se aplicaria à operação de GroupBy dentro de SummarizeColumns, aproveitando a relação entre 'Product'[Product Key] and 'Reseller Sales'[ProductKey]. Consequentemente, os resultados da consulta incluiriam apenas linhas em que «Reseller Sales» [ProductKey] é igual a 229. No entanto, após a atualização, GroupBy colunas dentro SummarizeColumns não serão mais filtradas por colunas de tabelas externas, evenif existir uma relação entre elas. Portanto, no exemplo acima, a coluna GroupBy 'Reseller Sales'[ProductKey] not será filtrada pela coluna 'Product'[ProductKey]. Como resultado, a consulta incluirá linhas em que 'Reseller Sales'[ProductKey] é not igual a 229.

If preferir manter o comportamento previous, você pode reescrever a expressão usando Summarize em vez de SummarizeColumns, conforme mostrado abaixo:

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

Esta expressão reescrita preserva a semântica original onde a operação GroupBy é not 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, ifallGroupBy colunas de uma tabela específica eram totalmente cobertas por um único Treatasfilter dessa 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 Treatasfilter, independentemente de serem válidas ornot. Por exemplo, o resultado seria uma tabela de uma única linha ("Estados Unidos", "Alberta"), evenif nenhuma linha com [País] = "Estados Unidos" and [Estado] = "Alberta" existia na tabela 'Geografia'.

Este problema era conhecido and foi resolvido pela atualização. Após a atualização, essas linhas inválidas serão filtradas and apenas as linhas válidas da tabela GroupBy serão retornadas. Portanto, o resultado para a consulta acima seria vazio, pois não há linhas válidas correspondentes ao values especificado [País] and [Estado] na tabela 'Geografia'.

Não permitir Keepfiltersmistos /overriddefilters na mesma tabela/cluster

A atualização recente introduziu uma restrição temporária que dispara uma mensagem error 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." 

Esse error ocorre quando filters normais (que substituem filtersexistentes) andfilters com KeepFilters especificado 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 filters na tabela 'Geografia': um com KeepFilters especificado and outro sem. Estes filters sobrepõem-se a filters externos em colunas diferentes. Atualmente, essa configuração not é permitida porque, internamente, os dois filters são agrupados em um só, and o sistema não pode determinar o comportamento correto filter de substituição para o filter agrupado em geral nesses casos.

Tenha em atenção que esta restrição é temporária. Estamos desenvolvendo ativamente soluções para remover essa limitação em atualizações futuras. If você encontrar esse error, recomendamos ajustar o filters dentro SummarizeColumns adicionando or removendo KeepFilters conforme necessário para garantir um comportamento de substituição consistente em cada tabela.

SUMMARIZE