SUMMARIZECOLUMNS
Se aplica a:columna CalculadaTabla calculadaMeasurecálculo visual
Devuelve una tabla de resumen sobre un conjunto de grupos.
Sintaxis
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
Parámetros
Término | Definición |
---|---|
groupBy_columnName |
Referencia de columna completa (Tabla[Columna]) a una tabla base para la que se incluyen los values distintos en la tabla devuelta. Cada columna groupBy_columnName está combinada entre sí (tablas diferentes) or existe automáticamente (misma tabla) con las columnas especificadas posteriores. |
filterTable |
Expresión de tabla que se agrega al contexto filter de all columnas especificadas como argumentos groupBy_columnName. Los values presentes en la tabla filter se usan para filter antes de realizar la combinación cruzada o auto-existiendo. |
name |
Cadena que representa el nombre de columna que se va a usar para la expresión siguiente especificada. |
expression |
Cualquier expresión DAX que devuelva un solo value (not una tabla). |
Devolver value
Tabla que incluye combinaciones de values de las columnas proporcionadas en función de la agrupación especificada. Solo las filas para las que al menos una de las expresiones proporcionadas devuelven unablankvalue no se incluyen en la tabla devuelta. If all expresiones evaluate para BLANK/NULL para una fila, esa fila se not incluida en la tabla devuelta.
Notas
Esta función not garantiza cualquier criterio de ordenación para los resultados.
No se puede especificar una columna más de una vez en el parámetro groupBy_columnName. Por ejemplo, la fórmula siguiente no es válida.
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
Esta función se not se admite para su uso en el modo DirectQuery cuando se usa en columnas calculadas or reglas de seguridad de nivel de fila (RLS).
contexto de Filter
Considere la consulta siguiente:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
En esta consulta, sin una measure las columnas groupBynot contienen ninguna columna de la expresión FILTER (por ejemplo, de la tabla Customer). El filter se aplica not a las columnas de groupBy. Las tablas Sales Territory and Customer pueden estar indirectamente related a través de la tabla Reseller sales fact. Dado que se not directamente related, la expresión filter es un no-op and las columnas de groupBy se ven afectadas not.
Pero con esta consulta:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
Las columnas groupBy contienen una columna que se ve afectada por el filterand que filter se aplica a los resultados de groupBy.
Con IGNORE
La sintaxis IGNORE se puede usar para modificar el comportamiento de la función SUMMARIZECOLUMNS omitiendo expresiones específicas de la evaluación de BLANK/NULL. Las filas para las que all expresiones not mediante IGNORE devolución BLANK/NULL se excluirán independientemente de si las expresiones que usan IGNOREevaluate para BLANK/NULL ornot. IGNORE solo se puede usar dentro de una expresión SUMMARIZECOLUMNS.
Ejemplo
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
Esto acumula la columna Sales[CustomerId], creando un subtotal para all clientes en la agrupación especificada. Sin IGNORE, el resultado es:
CustomerId | Cantidad total | BlankIfTotalQtyIsNot3 |
---|---|---|
A | 5 | |
B | 3 | 3 |
C | 3 | 3 |
Con IGNORE,
CustomerId | Cantidad total | BlankIfTotalQtyIsNot3 |
---|---|---|
B | 3 | 3 |
C | 3 | 3 |
All expresión omitida,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Even aunque ambas expresiones devuelven blank para algunas filas, se incluyen, ya que no hay expresiones inignos que devuelven blank.
CustomerId | Blank | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
Con NONVISUAL
La función NONVISUAL marca un valuefilter en SUMMARIZECOLUMNS función como not que afecta a measurevalues, pero solo se aplica a columnas de groupBy. NONVISUAL solo se puede usar dentro de una expresión SUMMARIZECOLUMNS.
Ejemplo
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]
Devuelve el resultado en el que [Ventas totales visuales] es el total en all años:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9 791 060,30 | 29 358 677,22 |
2008 | 9 770 899,74 | 29 358 677,22 |
En cambio, la misma consulta sin la función 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]
Devuelve un resultado en el que [Visual Total Sales] es el total entre los dos años seleccionados:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9 791 060,30 | 19 561 960,04 |
2008 | 9 770 899,74 | 19 561 960,04 |
Con ROLLUPADDISSUBTOTAL
La adición de la sintaxis ROLLUPADDISSUBTOTAL modifica el comportamiento de la función SUMMARIZECOLUMNS agregando rollupfilas /subtotales al resultado en función de las columnas de groupBy_columnName. ROLLUPADDISSUBTOTAL solo se puede usar dentro de una expresión SUMMARIZECOLUMNS.
Ejemplo con un solo 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]
Devuelve la tabla siguiente:
Category | Subcategoría | IsCategorySubtotal | IsSubcategorySubtotal | Cantidad total |
---|---|---|---|---|
True | True | 60 398 | ||
Accessories | False | True | 36 092 | |
Accessories | Marcos de bicicletas | False | False | 328 |
Bikes | Bicicletas de montaña | False | False | 4970 |
Clothing | False | True | 9101 |
Ejemplo con varios subtotales
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
Las ventas se agrupan por estado, por cliente, por date, con subtotales para 1. Ventas por estado, por date 2. Ventas por estado, por cliente 3. Se inscribió en ambas anddate de clientes que conducen a las ventas por estado.
Devuelve la tabla siguiente:
CustomerID | IsCustomerSubtotal | State | Cantidad total | Date | IsDateSubtotal |
---|---|---|---|---|---|
A | FALSE |
WA | 5 | 10/07/2014 | |
B | FALSE |
WA | 1 | 10/07/2014 | |
B | FALSE |
WA | 2 | 11/07/2014 | |
C | FALSE |
OR | 2 | 10/07/2014 | |
C | FALSE |
OR | 1 | 11/07/2014 | |
TRUE |
WA | 6 | 10/07/2014 | ||
TRUE |
WA | 2 | 11/07/2014 | ||
TRUE |
OR | 2 | 10/07/2014 | ||
TRUE |
OR | 1 | 11/07/2014 | ||
A | FALSE |
WA | 5 | TRUE |
|
B | FALSE |
WA | 3 | TRUE |
|
C | FALSE |
OR | 3 | TRUE |
|
TRUE |
WA | 8 | TRUE |
||
TRUE |
OR | 3 | TRUE |
Con ROLLUPGROUP
Al igual que con la función SUMMARIZE, se puede usar ROLLUPGROUP junto con ROLLUPADDISSUBTOTAL para especificar qué grupos de resumen o granularidades (subtotales) se van a incluir, lo que reduce el número de filas subtotales devueltas. ROLLUPGROUP solo se puede usar dentro de una expresión SUMMARIZECOLUMNSorSUMMARIZE.
Ejemplo con varios subtotales
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
Todavía agrupado por City and State, pero se enrolla al informar de que un subtotal devuelve la tabla siguiente,
State | CustomerId | IsCustomerSubtotal | Cantidad total | City (Ciudad) | IsCityStateSubtotal |
---|---|---|---|---|---|
WA | A | FALSE |
2 | Bellevue | FALSE |
WA | B | FALSE |
2 | Bellevue | FALSE |
WA | A | FALSE |
3 | Redmond | FALSE |
WA | B | 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 |
||
B | FALSE |
3 | TRUE |
||
C | FALSE |
3 | TRUE |
||
TRUE |
11 | TRUE |
SummarizeColumns contextual
Fondo
Hasta febrero de 2023, SUMMARIZECOLUMNSnot apoyaron la evaluación en una transición de contexto en all. En los productos publicados antes de ese month, esta limitación hizo SUMMARIZECOLUMNSnot útil en la mayoría de las medidas , era not posible llamar a un measureSUMMARIZECOLUMNS en cualquier caso de transición de contexto, incluidas otras SUMMARIZECOLUMNSstatements.
A partir de febrero de 2023, la transición de contexto se admite en algunos escenarios, pero not en all las condiciones. Los casos restringidos de and admitidos son los siguientes:
tipo de SummarizeColumns | Filter externos con una sola columna | Filter externo con más de una columna | Columnas de GroupBy externas |
---|---|---|---|
SummarizeColumns solo con GroupBy | Aceptar | Aceptar | Aceptar |
SummarizeColumns con Filters/Measures | Aceptar | ERROR | ERROR |
A partir de junio de 2024, habilitamos la SummarizeColumns contextual que permite evaluar SummarizeColumns en cualquier transición de contexto, SummarizeColumns en measure es now totalmente compatible:
tipo de SummarizeColumns | Filter externos con una sola columna | Filter externo con más de una columna | Columnas de GroupBy externas |
---|---|---|---|
SummarizeColumns solo con GroupBy | Aceptar | Aceptar | Aceptar |
SummarizeColumns con Filters/Measures | Aceptar | Aceptar | Aceptar |
Sin embargo, esta actualización también incluye cambios en el comportamiento de SummarizeColumns, que pueden modificar los resultados de las expresiones existentes:
Semántica de SelfValue para filters externos
Estamos introduciendo un concepto semántico denominado SelfValue, que modifica cómo filters de las tablas externas interactúan con columnas de GroupBy en SummarizeColumns. Este cambio no permite filters de una tabla diferente para afectar a las columnas de GroupBy, evenif las tablas se related a través de una relación filter-by. Un ejemplo que ilustra el impacto de este cambio implica la siguiente expresión:
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Antes de esta actualización, el TreatAsfilter se aplicaría a la operación de GroupBy dentro de SummarizeColumns, aprovechando la relación entre "Product"[Product Key] and "Reseller Sales" [ProductKey]. Por lo tanto, los resultados de la consulta solo incluirían filas en las que "Ventas a revendedores" [ProductKey] es igual a 229. Sin embargo, después de la actualización, las columnas de GroupBy dentro de SummarizeColumns ya no se filtrarán por columnas de tablas externas, evenif existe una relación entre ellas. Por lo tanto, en el ejemplo anterior, la columna GroupBy "Reseller Sales" [ProductKey] not filtrará por la columna "Product"[ProductKey]. Como resultado, la consulta incluirá filas donde "Reseller Sales" [ProductKey] es not igual a 229.
If prefiere conservar el comportamiento de previous, puede volver a escribir la expresión mediante Summarize en lugar de SummarizeColumns, como se muestra a continuación:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Esta expresión reescrita conserva la semántica original en la que la operación de GroupBy se not ve afectada por la restricción SelfValue introducida por la actualización.
Validación de filas para columnas de groupby totalmente cubiertas por Treatas
Antes de esta actualización, dentro de una función SummarizeColumns, ifallGroupBy columnas de una tabla específica estaban totalmente cubiertas por una sola Treatasfilter de esa misma tabla, como se muestra a continuación:
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
El resultado de la consulta anterior incluiría las filas especificadas en el Treatasfilter, independientemente de si eran válidas ornot. Por ejemplo, el resultado sería una tabla de una sola fila ("Estados Unidos", "Alberta"), evenif ninguna fila con [País] = "Estados Unidos" and [State] = "Alberta" existía en la tabla "Geography".
La actualización ha solucionado este problema and. Después de la actualización, estas filas no válidas se filtrarán, and solo se devolverán filas válidas de la tabla GroupBy. Por lo tanto, el resultado de la consulta anterior estaría vacío, ya que no hay filas válidas que coincidan con el [País] especificado and [Estado] values en la tabla "Geography".
No permitir Keepfiltersmixtos /overriddefilters en la misma tabla o clúster
La actualización reciente ha introducido una restricción temporal que desencadena un mensaje de error que indica:
"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 error se produce cuando ambos filters normales (que invalidan los filtersexistentes) andfilters con KeepFilters especificados están presentes en la misma tabla o clúster. Por ejemplo:
Evaluate CalculateTable(
SummarizeColumns(
Product[Color],
KeepFilters(
TreatAs(
{( "Washington")}
, Geography[State]
)
),
TreatAs(
{("United States"), ("Canada")}
, Geography[Country]
)
)
,TreatAs({("Alberta")}, Geography[State])
,TreatAs({("Canada")}, Geography[Country])
)
En la expresión anterior, hay dos filters en la tabla "Geography": una con KeepFilters especificado and uno sin. Estos filters se superponen con filters externos en columnas diferentes. Actualmente, esta configuración se not permite porque internamente, los dos filters se agrupan en uno, and el sistema no puede determinar el comportamiento correcto filter invalidar para el filter agrupado en general en estos casos.
Tenga en cuenta que esta restricción es temporal. Estamos desarrollando soluciones activamente para quitar esta limitación en futuras actualizaciones. If encuentra este error, se recomienda ajustar el filters dentro de SummarizeColumns agregando or quitando KeepFilters según sea necesario para garantizar un comportamiento de invalidación coherente en cada tabla.