Comparteix a través de


SUMMARIZECOLUMNS

Se aplica a: Columna calculada Tabla calculada Medida Cá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 (Table[Column]) a una tabla base para la que se incluyen los valores diferenciados en la tabla devuelta. En cada columna groupBy_columnName se realiza una operación de combinación cruzada (tablas diferentes) o de existencia automática (la misma tabla) con las columnas siguientes especificadas.
filterTable Expresión de tabla que se agrega al contexto de filtro de todas las columnas especificadas como argumentos groupBy_columnName. Los valores presentes en la tabla de filtros se usan para filtrar antes de que se realice la operación de combinación cruzada o de existencia automática.
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 único valor (no una tabla).

Valor devuelto

Una tabla que incluye combinaciones de valores de las columnas proporcionadas en función de la agrupación especificada. Solo se incluyen en la tabla devuelta las filas para las que al menos una de las expresiones proporcionadas devuelve un valor que no está en blanco. Si todas las expresiones se evalúan como BLANK/NULL para una fila, esa fila no se incluye en la tabla devuelta.

Notas

  • Esta función no garantiza ningún 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 no se admite para su uso en el modo DirectQuery cuando se utiliza en columnas calculadas o en reglas de seguridad de nivel de fila (RLS).

Contexto de filtro

Considere la consulta siguiente:

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

En esta consulta, sin una medida, las columnas groupBy no contienen ninguna columna de la expresión FILTER (por ejemplo, de la tabla Customer). El filtro no se aplica a las columnas groupBy. Las tablas Sales Territory y Customer pueden estar indirectamente relacionadas a través de la tabla de hechos Reseller sales. Como no están relacionadas directamente, la expresión de filtro es no-op y las columnas groupBy no se ven afectadas.

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 filtro y dicho filtro 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 BLANK/NULL. Las filas para las que todas las expresiones que no usen IGNORE devuelvan BLANK/NULL se excluirán, aunque las expresiones que usen IGNORE se evalúen como BLANK/NULL. IGNORE solo se puede usar en una expresión SUMMARIZECOLUMNS.

Ejemplo

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

Acumula la columna Sales[CustomerId] y crea un subtotal para todos los clientes de la agrupación especificada. Sin IGNORE, el resultado es el siguiente:

CustomerId Cantidad total BlankIfTotalQtyIsNot3
A 5
B 3 3
C 3 3

Con IGNORE:

CustomerId Cantidad total BlankIfTotalQtyIsNot3
B 3 3
C 3 3

Todas las expresiones omitidas:

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

Aunque ambas expresiones devuelven un valor en blanco para algunas filas, se incluyen porque no hay expresiones no omitidas que devuelven valores en blanco.

CustomerId En blanco BlankIfTotalQtyIsNot5
A 5
B
C

Con NONVISUAL

La función NONVISUAL marca un filtro de valor en la función SUMMARIZECOLUMNS como que no afecta a los valores de medida, sino que solo se aplica a las columnas groupBy. NONVISUAL solo se puede usar en 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 un resultado en el que [Visual Total Sales] es el total entre todos los 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 suma de la sintaxis ROLLUPADDISSUBTOTAL modifica el comportamiento de la función SUMMARIZECOLUMNS al agregar filas de acumulación o subtotal al resultado en función de las columnas de groupBy_columnName. ROLLUPADDISSUBTOTAL solo se puede usar en 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 fecha, con subtotales de 1. Ventas por estado, por fecha 2. Ventas por estado, por cliente 3. Se acumula tanto en el cliente como en la fecha, lo que conduce 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 O BIEN 2 10/07/2014
C false O BIEN 1 11/07/2014
true WA 6 10/07/2014
true WA 2 11/07/2014
true O BIEN 2 10/07/2014
true O BIEN 1 11/07/2014
A false WA 5 true
B false WA 3 true
C false O BIEN 3 TRUE
VERDADERO WA 8 TRUE
VERDADERO O BIEN 3 true

Con ROLLUPGROUP

Al igual que con la función SUMMARIZE, ROLLUPGROUP se puede usar junto con ROLLUPADDISSUBTOTAL para especificar qué grupos de resumen o granularidades (subtotales) se incluirán, lo que reduce el número de filas de subtotal devueltas. ROLLUPGROUP solo se puede usar en una expresión SUMMARIZECOLUMNS o SUMMARIZE.

Ejemplo con varios subtotales

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

Todavía se agrupan por ciudad y estado, pero se acumulan cuando notificar 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
O BIEN C false 3 Portland false
WA true 4 Bellevue false
WA true 4 Redmond false
O BIEN true 3 Portland false
A false 5 FALSO
B false 3 true
C false 3 TRUE
TRUE 11 VERDADERO

SummarizeColumns contextual

Fondo

Hasta febrero de 2023, SUMMARIZECOLUMNS no admitía la evaluación en una transición de contexto. En los productos publicados antes de ese mes, esta limitación hacía que SUMMARIZECOLUMNS no fuera útil en la mayoría de las medidas: no era posible llamar SUMMARIZECOLUMNS a una medida en ningún caso de transición de contexto, incluidas otras declaraciones SUMMARIZECOLUMNS.

A partir de febrero de 2023, la transición de contexto se admite en algunos escenarios, pero no en todas las condiciones. Los casos admitidos y restringidos son los siguientes:

Tipo SummarizeColumns Filtro externo con una sola columna Filtro externo con más de una columna Columnas AgruparPor externas
SummarizeColumns solo con AgruparPor Aceptar Aceptar Aceptar
SummarizeColumns con Filtros/Medidas OK (CORRECTO) ERROR ERROR

Desde junio de 2024, habilitamos SummarizeColumns contextuales que permiten que SummarizeColumns se evalúe en cualquier transición de contexto, SummarizeColumns en medida es ahora totalmente compatible:

Tipo SummarizeColumns Filtro externo con una sola columna Filtro externo con más de una columna Columnas AgruparPor externas
SummarizeColumns solo con AgruparPor Aceptar Aceptar Aceptar
SummarizeColumns con Filtros/Medidas 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 filtros externos

Presentamos un concepto semántico denominado SelfValue, que modifica cómo interactúan los filtros de las tablas externas con las columnas AgruparPor en SummarizeColumns. Este cambio no permite que los filtros de una tabla diferente afecten a las columnas AgruparPor, incluso si las tablas están relacionadas a través de una relación de filtrar por. 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 filtro TreatAs se aplicaría a la operación AgruparPor dentro de SummarizeColumns, aprovechando la relación entre "Producto"[Product Key] y "Ventas a revendedores"[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 AgruparPor dentro de SummarizeColumns ya no se filtrarán por columnas de tablas externas, incluso si existe una relación entre ellas. Por lo tanto, en el ejemplo anterior, la columna AgruparPor "Ventas a revendedores" [ProductKey] no se filtrará por la columna "Producto"[ProductKey]. Como resultado, la consulta incluirá filas en las que "Ventas a revendedores" [ProductKey] no es igual a 229.

Si prefiere conservar el comportamiento anterior, 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 AgruparPor no se ve afectada por la restricción SelfValue introducida por la actualización.

Validación de filas para columnas AgruparPor totalmente cubiertas por Treatas

Antes de esta actualización, dentro de una función SummarizeColumns, si todas las columnas AgruparPor de una tabla específica estaban totalmente cubiertas por un único filtro Treatas 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 filtro Treatas, independientemente de si eran válidas o no. Por ejemplo, el resultado sería una tabla de una sola fila ("Estados Unidos", "Alberta"), incluso si no existía dicha fila con [País] = "Estados Unidos" y [Estado] = "Alberta" existía en la tabla "Geografía".

Se ha conocido este problema y se ha solucionado mediante la actualización. Después de la actualización, estas filas no válidas se filtrarán y solo se devolverán filas válidas de la tabla AgruparPor. Por lo tanto, el resultado de la consulta anterior estaría vacío, ya que no hay filas válidas que coincidan con los valores [Country] y [State] especificados en la tabla "Geografía".

No permitir keepfilters/overriddefilters mixtos 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 los filtros normales (que invalidan los filtros existentes) y los filtros 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 filtros en la tabla "Geografía": uno con KeepFilters especificado y otro sin él. Estos filtros se superponen con filtros externos en columnas diferentes. Actualmente, no se permite esta configuración porque internamente, los dos filtros se agrupan en uno y el sistema no puede determinar el comportamiento correcto de invalidación del filtro en clúster en estos casos.

Tenga en cuenta que esta restricción es temporal. Estamos desarrollando soluciones activamente para quitar esta limitación en futuras actualizaciones. Si se encuentra con este error, le recomendamos que ajuste los filtros dentro de SummarizeColumns agregando o eliminando KeepFilters según sea necesario para garantizar un comportamiento de invalidación coherente en cada tabla.

SUMMARIZE