Поделиться через


SUMMARIZECOLUMNS

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

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

Синтаксис

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

Параметры

Термин Определение
groupBy_columnName Полный справочник по столбцам (Table[Column]) базовой таблице, для которой в возвращаемую таблицу включены различные значения. Каждый столбец groupBy_columnName объединяется (разные таблицы) или автоматически существует (одна и та же таблица) с последующими указанными столбцами.
filterTable Табличное выражение, которое добавляется в контекст фильтра всех столбцов, указанных как groupBy_columnName аргументы. Значения, представленные в таблице фильтров, используются для фильтрации перед выполнением перекрестного соединения или автоматического существования.
name Строка, представляющая имя столбца, используемое для последующего выражения.
expression Любое выражение 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 возвращать BLANK/NULL, будут исключены независимо от того, будут ли выражения, использующие IGNORE оценивать BLANK/NULL или нет. IGNORE можно использовать только в выражении 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

Функция 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
Аксессуары Ложный Истинный 36092
Аксессуары Багажники для велосипедов Ложный Ложный 328
Велосипеды Горные велосипеды Ложный Ложный 4970
Clothing Ложный Истинный 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 OR 2 7/10/2014
C FALSE OR 1 7/11/2014
TRUE WA 6 7/10/2014
TRUE WA 2 7/11/2014
TRUE OR 2 7/10/2014
TRUE OR 1 7/11/2014
а FALSE WA 5 TRUE
Б FALSE WA 3 TRUE
C FALSE OR 3 TRUE
TRUE WA 8 TRUE
TRUE OR 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
OR C FALSE 3 Портленд FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Редмонд FALSE
OR TRUE 3 Портленд FALSE
а FALSE 5 FALSE
Б FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

Contextual SummarizeColumns

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

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

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

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

Начиная с июня 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, независимо от того, являются ли они допустимыми или нет. Например, результатом будет таблица с одной строкой ("Соединенные Штаты", "Альберта"), даже если такая строка с [Страна] = "Соединенные Штаты" и [Штат] = "Альберта" существовала в таблице 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 при необходимости, чтобы обеспечить согласованное переопределение в каждой таблице.

SUMMARIZE