Compartir vía


SUMMARIZECOLUMNS

Se aplica a:columna Calculadatabla calculadaMedidacá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 valores distintos en la tabla devuelta. Cada columna groupBy_columnName está combinada entre sí (tablas diferentes) o existe automáticamente (misma tabla) con las columnas especificadas posteriores.
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 filtro se usan para filtrar antes de realizar la combinación cruzada o auto-exist.
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 valor único (no una tabla).

Valor devuelto

Tabla que incluye combinaciones de valores 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 un valor no en blanco se incluyen en la tabla devuelta. 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 usa en columnas calculadas o 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 Territorio de ventas y Cliente pueden estar relacionadas indirectamente a través de la tabla de hechos reseller sales. Dado que no están directamente relacionados, la expresión de filtro es un 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 ese filtro se aplica a los resultados 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 todas las expresiones que no usan IGNORE devuelven BLANK/NULL se excluirán independientemente de si las expresiones que usan IGNORE se evalúan como BLANK/NULL o no. 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 todos los clientes de 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

Todas las expresiones ignoradas,

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

Aunque ambas expresiones devuelven espacio en blanco para algunas filas, se incluyen, ya que no hay expresiones inignos que devuelven en blanco.

CustomerId Espacio en blanco BlankIfTotalQtyIsNot5
A 5
B
C

Con NONVISUAL

La función NONVISUAL marca un filtro de valor en SUMMARIZECOLUMNS función como no afecta a los valores de medida, sino que solo se aplica a las columnas 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 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 adición de la sintaxis ROLLUPADDISSUBTOTAL modifica el comportamiento de la función SUMMARIZECOLUMNS mediante la adición de filas de acumulación o subtotal 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
Verdadero Verdadero 60 398
Accessories Falso Verdadero 36 092
Accessories Marcos de bicicletas Falso Falso 328
Bikes Bicicletas de montaña Falso Falso 4970
Clothing Falso Verdadero 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 para 1. Ventas por estado, por fecha 2. Ventas por estado, por cliente 3. Se inscribe tanto en el cliente como en la fecha que conduce a las ventas por estado.

Devuelve la tabla siguiente:

CustomerID IsCustomerSubtotal State Cantidad total Fecha 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 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 agrupado por Ciudad y Estado, pero se agrupa 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

Resumen contextualColumns

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 hizo SUMMARIZECOLUMNS no resultaba útil en la mayoría de las medidas, no era posible llamar a una medida SUMMARIZECOLUMNS en ningún caso de transición de contexto, incluidas otras declaraciones de 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 GroupBy externas
SummarizeColumns solo con GroupBy Aceptar Aceptar Aceptar
SummarizeColumns with Filters/Measures Aceptar ERROR ERROR

A partir de junio de 2024, estamos habilitando summarizeColumns contextuales que permite evaluar SummarizeColumns en cualquier transición de contexto, SummarizeColumns en medida ahora es totalmente compatible:

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

Presentamos un concepto semántico denominado SelfValue, que modifica cómo interactúan los filtros de las tablas externas con las columnas GroupBy en SummarizeColumns. Este cambio no permite que los filtros de una tabla diferente afecten a las columnas GroupBy, incluso si las tablas están relacionadas a través de una relación de filtro 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 GroupBy dentro de SummarizeColumns, aprovechando la relación entre 'Product'[Product Key] y '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 GroupBy 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 GroupBy "Reseller Sales" [ProductKey] no se filtrará por la columna "Product"[ProductKey]. Como resultado, la consulta incluirá filas en las que "Reseller Sales" [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 GroupBy no se ve afectada por la restricción SelfValue introducida por la actualización.

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

Antes de esta actualización, dentro de una función SummarizeColumns, si todas las columnas GroupBy 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 "Geography".

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 GroupBy. 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 "Geography".

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 "Geography": uno con KeepFilters especificado y otro sin. 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 produce este error, se recomienda ajustar los filtros dentro de SummarizeColumns agregando o quitando KeepFilters según sea necesario para garantizar un comportamiento de invalidación coherente en cada tabla.

SUMMARIZE