SUMMARIZECOLUMNS

Область применения: вычисление вычисляемого столбца вычисляемой таблицы Меры визуального элемента

Возвращает сводную таблицу по набору групп.

Синтаксис

SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)  

Параметры

Термин Определение
groupBy_columnName Полный справочник по столбцам (Table[Column]) базовой таблице, для которой в возвращаемую таблицу включены различные значения. Каждый столбец groupBy_columnName объединяется (разные таблицы) или автоматически существует (одна и та же таблица) с последующими указанными столбцами.
filterTable Табличное выражение, которое добавляется в контекст фильтра всех столбцов, указанных как groupBy_columnName аргументы. Значения, представленные в таблице фильтров, используются для фильтрации перед выполнением перекрестного соединения или автоматического существования.
name Строка, представляющая имя столбца, используемое для последующего выражения.
выражение Любое выражение DAX, возвращающее одно значение (а не таблицу).

Возвращаемое значение

Таблица, содержащая сочетания значений из предоставленных столбцов на основе указанного группировки. В возвращаемую таблицу включены только строки, для которых по крайней мере одно из предоставленных выражений возвращает непустое значение. Если все выражения оцениваются как BLANK/NULL для строки, эта строка не включена в возвращаемую таблицу.

Замечания

  • Эта функция не гарантирует порядок сортировки результатов.

  • Столбец нельзя указать несколько раз в параметре groupBy_columnName. Например, следующая формула недопустима.

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

  • Эта функция не поддерживается для использования в режиме DirectQuery при использовании в вычисляемых столбцах или правилах безопасности на уровне строк (RLS).

Контекст фильтра

Обратите внимание на следующий запрос:

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

В этом запросе без меры столбцы groupBy не содержат столбцов из выражения FILTER (например, из таблицы Customer). Фильтр не применяется к столбцам groupBy. Таблицы "Территория продаж" и "Клиент" могут быть косвенно связаны с помощью таблицы фактов продаж торгового посредника. Так как они не связаны напрямую, выражение фильтра является no-op, и столбцы groupBy не влияют.

Однако с этим запросом:

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

Столбцы groupBy содержат столбец, который влияет на фильтр, и этот фильтр применяется к результатам groupBy.

С помощью IGNORE

Синтаксис IGNORE можно использовать для изменения поведения функции SUMMARIZECOLUMNS, пропуская определенные выражения из вычисления BLANK/NULL. Строки, для которых все выражения, не использующие значение IGNORE return BLANK/NULL, будут исключены независимо от того, будут ли выражения, использующие IGNORE, оценивать значение BLANK/NULL или нет. ИГНОРИРОВАТЬ можно использовать только в выражении SUMMARIZECOLUMNS.

Пример

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

Это свертит столбец Sales[CustomerId], создав промежуточный итог для всех клиентов в заданной группе. Без IGNORE результатом является:

CustomerId Всего Qty BlankIfTotalQtyIsNot3
а 5
Б 3 3
C 3 3

С помощью IGNORE,

CustomerId Всего Qty BlankIfTotalQtyIsNot3
Б 3 3
C 3 3

Все выражения игнорируются,

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

Несмотря на то, что оба выражения возвращают пустое значение для некоторых строк, они включаются, так как нет неигнорированных выражений, возвращающих пустое.

CustomerId Пробел BlankIfTotalQtyIsNot5
а 5
Б
C

С НЕВИЗУАЛЬНЫМ

Функция NONVISUAL обозначает фильтр значений в функции SUMMARIZECOLUMNS как не влияющую на значения меры, но применяется только к столбцам groupBy. NONVISUAL можно использовать только в выражении SUMMARIZECOLUMNS.

Пример

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]

Возвращает результат, в котором [визуальный итог продаж] — это общее количество в течение всех лет:

DimDate[CalendarYear] [Sales] [Визуальный итог продаж]
2007 9,791,060.30 29,358,677.22
2008 9,770,899.74 29,358,677.22

В отличие от этого, один и тот же запрос без функции 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]

Возвращает результат, в котором [визуальный итог продаж] — это общее число в течение двух выбранных лет:

DimDate[CalendarYear] [Sales] [Визуальный итог продаж]
2007 9,791,060.30 19,561,960.04
2008 9,770,899.74 19,561,960.04

С ROLLUPADDISSUBTOTAL

Добавление синтаксиса ROLLUPADDISSUBTOTAL изменяет поведение функции SUMMARIZECOLUMNS путем добавления строк свертки или промежуточных итогов в результат на основе столбцов groupBy_columnName. ROLLUPADDISSUBTOTAL можно использовать только в выражении SUMMARIZECOLUMNS.

Пример с одним промежуточным итогом

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]

Возвращает следующую таблицу:

Категория Подкатегории IsCategorySubtotal IsSubcategorySubtotal Всего Qty
Истина Истина 60398
Аксессуары False Истина 36092
Аксессуары Багажники для велосипедов False False 328
Велосипеды Горные велосипеды False False 4970
Clothing False Истина 9101

Пример с несколькими промежуточными итогими

SUMMARIZECOLUMNS ( 
    Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ), 
    ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] ) 
)

Продажи группируются по состоянию, по клиенту, по дате, с промежуточными итогими для 1. Продажи по состоянию на 2. Продажи по состоянию, клиент 3. Свернутый как на клиенте, так и на сегодняшний день, ведущий к продажам по состоянию.

Возвращает следующую таблицу:

CustomerID IsCustomerSubtotal Штат Всего Qty Дата IsDateSubtotal
а FALSE WA 5 7/10/2014
Б FALSE WA 1 7/10/2014
Б FALSE WA 2 7/11/2014
C FALSE ИЛИ 2 7/10/2014
C FALSE ИЛИ 1 7/11/2014
TRUE WA 6 7/10/2014
TRUE WA 2 7/11/2014
TRUE ИЛИ 2 7/10/2014
TRUE ИЛИ 1 7/11/2014
а FALSE WA 5 TRUE
Б FALSE WA 3 TRUE
C FALSE ИЛИ 3 TRUE
TRUE WA 8 TRUE
TRUE ИЛИ 3 TRUE

С помощью ROLLUPGROUP

Как и с функцией SUMMARIZE , ROLLUPGROUP можно использовать вместе с ROLLUPADDISSUBTOTAL , чтобы указать, какие сводные группы или детализированные (промежуточные итоги) следует включить, уменьшая количество возвращаемых промежуточных строк. ROLLUPGROUP можно использовать только в выражении SUMMARIZECOLUMNS или SUMMARIZE .

Пример с несколькими промежуточными итогими

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

По-прежнему группируются по городу и штату, но свернутые вместе при составлении промежуточных итогов возвращает следующую таблицу.

Штат CustomerId IsCustomerSubtotal Всего Qty Город IsCityStateSubtotal
WA а FALSE 2 Bellevue FALSE
WA Б FALSE 2 Bellevue FALSE
WA а FALSE 3 Редмонд FALSE
WA Б FALSE 1 Редмонд FALSE
ИЛИ C FALSE 3 Портленд FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Редмонд FALSE
ИЛИ TRUE 3 Портленд FALSE
а FALSE 5 FALSE
Б FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

Contextual SummarizeColumns

Общие сведения

До февраля 2023 года СВОДКАCOLUMNS не поддерживала оценку в рамках перехода контекста вообще. В продуктах, выпущенных до этого месяца, это ограничение сделало СУММЕCOLUMNS не полезным в большинстве мер . Невозможно вызвать меру SUMMARIZECOLUMNS в любом случае перехода контекста, включая другие инструкции SUMMARIZECOLUMNS.

С февраля 2023 года переход на контекст поддерживается в нескольких сценариях, но не во всех условиях. Поддерживаемые и ограниченные случаи:

Тип SummarizeColumns Внешний фильтр с одним столбцом Внешний фильтр с несколькими столбцами Внешние столбцы GroupBy
СуммированиеColumns только с GroupBy ОК ОК ОК
Сводка поcolumns с фильтрами и мерами ОК ОШИБКА ОШИБКА

Начиная с июня 2024 г. мы включаем контекстные суммыColumns, что позволяет суммироватьcolumns в любом переходе контекста, в мере SummarizeColumns теперь полностью поддерживается:

Тип SummarizeColumns Внешний фильтр с одним столбцом Внешний фильтр с несколькими столбцами Внешние столбцы GroupBy
СуммированиеColumns только с GroupBy ОК ОК ОК
Сводка поcolumns с фильтрами и мерами ОК ОК ОК

Однако это обновление также включает изменения в поведение СуммеColumns, что может изменить результаты существующих выражений:

Семантика SelfValue для внешних фильтров

Мы представляем семантическую концепцию с именем SelfValue, которая изменяет способ взаимодействия фильтров из внешних таблиц со столбцами GroupBy в SummarizeColumns. Это изменение запрещает фильтры из другой таблицы, чтобы повлиять на столбцы GroupBy, даже если таблицы связаны через связь по фильтрам. Пример, демонстрирующий влияние этого изменения, включает в себя следующее выражение:

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

Перед этим обновлением фильтр TreatAs будет применяться к операции GroupBy в SummarizeColumns, используя связь между Product[Product"[Product Key] и "Sales"[ProductKey]. Следовательно, результаты запроса будут содержать только строки, в которых "Продажи торговых посредников" [ProductKey] равно 229. Однако после обновления столбцы GroupBy в СуммеColumns больше не будут фильтруться по столбцам из внешних таблиц, даже если между ними существует связь. Поэтому в приведенном выше примере столбец GroupBy "Sales"[ProductKey] не будет фильтроваться по столбцу Product[ProductKey]. В результате запрос будет содержать строки, в которых "Продажи торгового посредника"[ProductKey] не равно 229.

Если вы предпочитаете сохранить предыдущее поведение, вы можете перезаписать выражение с помощью суммы вместо суммарного кода, как показано ниже:

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

Это перезаписное выражение сохраняет исходную семантику, в которой операция GroupBy не влияет на ограничение SelfValue, введенное обновлением.

Проверка строк для столбцов группирования, полностью охваченных Treatas

До этого обновления в функции SummarizeColumns все столбцы GroupBy из определенной таблицы полностью охватываются одним фильтром Treatas из той же таблицы, как показано ниже:

SummarizeColumns(
  Geography[Country], 
  Geography[State], 
  Treatas(
      {("United States", "Alberta")}, 
      Geography[Country], 
      Geography[State]
  )
)

Результат приведенного выше запроса будет включать все строки, указанные в фильтре Treatas, независимо от того, являются ли они допустимыми или нет. Например, результатом будет таблица с одной строкой ("США", "Альберта"), даже если такая строка с [Страна] = "США" и [State] = "Альберта" существовала в таблице Geography.

Эта проблема известна и устранена обновлением. После обновления такие недопустимые строки будут отфильтрованы, и будут возвращены только допустимые строки из таблицы GroupBy. Таким образом, результат для приведенного выше запроса будет пустым, так как в таблице Geography отсутствуют допустимые строки, соответствующие указанным значениям [Страна] и [State].

Запретить смешанные keepfilters/overriddefilters в одной таблице или кластере

Последнее обновление ввело временное ограничение, которое активирует сообщение об ошибке, указывающее:

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

Эта ошибка возникает, когда обычные фильтры (которые переопределяют существующие фильтры) и фильтры с указанными KeepFilters присутствуют в одной таблице или кластере. Например:

Evaluate CalculateTable(
  SummarizeColumns(
      Product[Color],
      KeepFilters(
          TreatAs(
              {( "Washington")}
              , Geography[State]
          )
      ),
      TreatAs(
          {("United States"), ("Canada")}
          , Geography[Country]
      )
  )
  ,TreatAs({("Alberta")}, Geography[State])
  ,TreatAs({("Canada")}, Geography[Country])
)

В приведенном выше выражении существует два фильтра в таблице Geography: один с указанными KeepFilters и один без. Эти фильтры перекрываются внешними фильтрами в разных столбцах. В настоящее время эта конфигурация не допускается, так как во внутреннем режиме два фильтра кластеризованы в одну, и система не может определить правильное поведение переопределения фильтра для кластеризованного фильтра в целом в таких случаях.

Обратите внимание, что это ограничение является временным. Мы активно разрабатываем решения для удаления этого ограничения в будущих обновлениях. При возникновении этой ошибки рекомендуется настроить фильтры в SummarizeColumns, добавив или удалив KeepFilters при необходимости, чтобы обеспечить согласованное переопределение в каждой таблице.

СУММИРОВАТЬ