SUMMARIZECOLUMNS
Aplica-se a:Coluna calculada
Tabela calculada
Medida
Cá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 valores distintos são incluídos na tabela retornada. Cada coluna groupBy_columnName é cruzada (tabelas diferentes) ou auto-existente (mesma tabela) com as colunas especificadas subsequentes. |
filterTable |
Uma expressão de tabela que é adicionada ao contexto de filtro de todas as colunas especificadas como argumentos groupBy_columnName. Os valores presentes na tabela de filtros são usados para filtrar 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 valor (não uma tabela). |
Valor de retorno
Uma tabela que inclui combinações de valores das colunas fornecidas com base no agrupamento especificado. Somente as 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 BLANK/NULL para uma linha, essa linha não será incluída na tabela retornada.
Observações
Esta função não 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 não é suportada para utilização no modo DirectQuery quando utilizada em colunas calculadas ou regras de segurança ao nível da linha (RLS).
Contexto do filtro
Considere a seguinte consulta:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
Nesta consulta, sem uma medida, as colunas groupBy não contêm colunas da expressão FILTER (por exemplo, da tabela Customer). O filtro não é aplicado às colunas groupBy. As tabelas Território de Vendas e Cliente podem estar indiretamente relacionadas através da tabela de fatos de vendas do Revendedor. Como elas não estão diretamente relacionadas, a expressão de filtro é uma no-op 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 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 independentemente de as expressões que usam IGNORE avaliar para BLANK/NULL ou não. 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 todos os 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 |
Todas as expressões ignoradas,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Embora ambas as expressões retornem em branco para algumas linhas, elas são incluídas, pois não há expressões não ignoradas que retornam em branco.
ID do Cliente | Em branco | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
N | ||
C |
Com NONVISUAL
A função NONVISUAL marca um filtro de valor em SUMMARIZECOLUMNS função como não afetando valores de medida, mas apenas se aplicando a colunas groupBy. 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 em todos os 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 linhas de rollup/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 |
---|---|---|---|---|
Verdadeiro | Verdadeiro | 60398 | ||
Accessories | Falso | Verdadeiro | 36092 | |
Accessories | Suportes para bicicletas | Falso | Falso | 328 |
Bikes | Mountain Bikes | Falso | Falso | 4970 |
Vestuário | 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 no cliente e na data que leva às vendas por estado.
Devolve a seguinte tabela,
IDDeCliente | IsCustomerSubtotal | Estado | Qtd total | Data | 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 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 agrupado por Cidade e 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 |
ResumirColunas contextuais
Fundo
Até fevereiro de 2023, SUMMARIZECOLUMNS não apoiava a avaliação dentro de uma transição de contexto. Em produtos lançados antes desse mês, essa limitação fez com que SUMMARIZECOLUMNS não fosse útil na maioria das medidas – não era possível chamar uma medida de SUMMARIZECOLUMNS em qualquer caso de transição de contexto, incluindo outras declarações de SUMMARIZECOLUMNS.
A partir de fevereiro de 2023, a transição de contexto foi apoiada em alguns cenários, mas não em todas as condições. Os casos apoiados e restritos são os seguintes:
Tipo SummarizeColumns | Filtro externo com coluna única | Filtro externo com mais de uma coluna | Colunas Externas GroupBy |
---|---|---|---|
SummarizeColumns apenas com GroupBy | OK | OK | OK |
ResumirColunas com Filtros/Medidas | OK | ERROR | ERROR |
A partir de junho de 2024, estamos habilitando SummarizeColumns contextuais que permite que SummarizeColumns seja avaliado em qualquer transição de contexto, SummarizeColumns em medida agora é totalmente suportado:
Tipo SummarizeColumns | Filtro externo com coluna única | Filtro externo com mais de uma coluna | Colunas Externas GroupBy |
---|---|---|---|
SummarizeColumns apenas com GroupBy | OK | OK | OK |
ResumirColunas 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 de 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 as colunas GroupBy em SummarizeColumns. Essa 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 filtro por. 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 dessa atualização, o filtro TreatAs se aplicava à operação GroupBy dentro de SummarizeColumns, aproveitando a relação entre 'Product'[Product Key] e '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, as colunas GroupBy em SummarizeColumns não serão mais filtradas por colunas de tabelas externas, mesmo que exista uma relação entre elas. Portanto, no exemplo acima, a coluna GroupBy 'Reseller Sales'[ProductKey] não será filtrada pela coluna 'Product'[ProductKey]. Como resultado, a consulta incluirá linhas em que 'Reseller Sales'[ProductKey] não é igual a 229.
Se preferir manter o comportamento anterior, 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 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 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 filtro Treatas, independentemente de serem válidas ou não. Por exemplo, o resultado seria uma tabela de uma única linha ("Estados Unidos", "Alberta"), mesmo que nenhuma linha com [País] = "Estados Unidos" e [Estado] = "Alberta" existisse na tabela "Geografia".
Esse problema era conhecido e foi resolvido pela atualização. Após a atualização, essas linhas inválidas serão filtradas e somente as linhas válidas da tabela GroupBy serão retornadas. Portanto, o resultado da consulta acima estaria vazio, pois não há linhas válidas correspondentes aos valores especificados [País] e [Estado] 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 os filtros normais (que substituem os filtros existentes) e os 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 'Geography': um com KeepFilters especificado e outro sem. Estes filtros sobrepõem-se a filtros externos em colunas diferentes. Atualmente, essa configuração não é permitida porque, internamente, os dois filtros são agrupados 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.
Tenha em atenção que esta restrição é temporária. Estamos desenvolvendo ativamente soluções para remover essa limitação em atualizações futuras. Se você encontrar esse erro, recomendamos ajustar os filtros em SummarizeColumns adicionando ou removendo KeepFilters conforme necessário para garantir um comportamento de substituição consistente em cada tabela.