Теперь ты видишь меня! Варианты использования функции ALL в DAX и Power BI

Tags: PowerBI, Power BI, DAX

Среди всех функций в DAX; поведение функции ALL все еще кажется загадочным для многих. Многие люди вообще не используют его и в итоге пишут очень сложные вычисления для сценария, в котором только одно простое выражение может выполнить одну и ту же работу. Некоторые люди используют его, но не знают точно, как работает эта функция, получают неожиданные результаты и называют это ошибкой. В этой статье мы объясним, что такое функция ALL, как ее можно использовать и каковы случаи использования такой функции в DAX и Power BI.

Необходимое условие

Набор данных для этой модели - это файл Excel AdventureWorksDW2012, который можно загрузить здесь. Таблицы, используемые в этом примере, представляют собой DimCustomer, DimProduct, FactInternetSales.

 

Что такое функция ALL() в DAX?

Чтобы понять поведение функции ALL, нет ничего лучше примера, давайте посмотрим, как она работает в действии. Мы создали показатель, используя функцию ALL. Функция ALL принимает таблицу в качестве входных данных, и

ALL( <table name or column name>, [Column name 1],[column name 2], …)

 

Вывод функции ALL - ТАБЛИЦА, и вы не можете использовать ее в качестве меры. Как вы можете видеть на скриншоте ниже, если мы создаем меру с ALL, то мы получаем сообщение об ошибке: “Выражение относится к нескольким столбцам. Несколько столбцов не могут быть преобразованы в скалярное значение.”

 

Поскольку вывод функции ALL является таблицей, у вас есть только два способа использовать ее в DAX:

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

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

 

Или, если вы используете все только с одним или несколькими столбцами, то вы получите таблицу с четкой комбинацией этих значений столбцов;

ALL (FactInternetSales [SalesAmount]) вернет только 42 строки, что является различными значениями в столбце SalesAmount,

  

Однако, если ALL используется с комбинацией столбцов, например, как с такими тремя колонками, тогда комбинация будет отличаться:

 

Используя функцию ALL в таблице Calculated, приведем один из самых распространенных вариантов использования функции ALL:

Измерение ролевой игры с использованием ALL и Расчетных таблиц

Вы можете создавать ролевые измерения, которые являются копиями существующего измерения (например, измерение «Дата»).

 

Использование ALL в качестве входа для других функций DAX

Если ALL не могут быть использованы непосредственно в Measure, это не критично. Она может использоваться как входной параметр для других функций. В DAX есть много функций, которые принимают таблицу в качестве входных данных. Все эти функции могут принимать  ALL как свои входные параметры. Например, SUMX - это функция, одним из параметров которой является таблица: в нашем случае, это может быть таблица, сгенерированная ALL как функция.

 

Например, это один из примеров использования ALL и SUMX:

<div><br class="Apple-interchange-newline">Measure = SUMX(
               ALL(
                   FactInternetSales
               ),
               FactInternetSales[SalesAmount]
)</div>

1

2

3

4

5

6

Measure = SUMX(

               ALL(

                   FactInternetSales

               ),

               FactInternetSales[SalesAmount]

)

 

SUMX - это только одна из функций DAX, которая принимает таблицу в качестве входного параметра. Есть много других функций, таких как Calculate и многие другие функции в той же категории. Комбинация ALL с другими функциями и использование этого в мерах DAX являются наиболее распространенными методами использования этой функции. Но прежде чем идти дальше, давайте объясним кое-что очень важное о функциях ALL.

ALL игнорирует фильтр

В дополнение к возвращению таблицы в качестве вывода, ALL также будет игнорировать любые фильтры, примененные к ней. Что это значит? Что если у вас есть визуализация, которая чем-то отфильтрована, то ALL все равно! Это будет действовать так, будто там нет фильтра. Вот пример:

 

1

2

3

4

Total Margin = SUMX(

ALL(FactInternetSales),

FactInternetSales[SalesAmount]-FactInternetSales[TotalProductCost]

)

 

Выражение Sum of Margin представлено ниже:

 

1

2

3

4

Total Margin = SUMX(

FactInternetSales,

FactInternetSales[SalesAmount]-FactInternetSales[TotalProductCost]

)


а вот выражение Total Margin:

1

2

3

4

Total Margin = SUMX(

ALL(FactInternetSales),

FactInternetSales[SalesAmount]-FactInternetSales[TotalProductCost]

)

Как видите, единственное отличие - использование ALL в выражении Total Margin. Выходное значение также отличается. Общая маржа в каждой строке имеет одинаковое значение; 12 080 883,65 долл., Например, как маржа никогда не фильтруется программой Education, или, скажем, функция ALL игнорирует примененный фильтр.

 

Общий вариант использования для ALL: Расчет процента

Одним из наиболее распространенных вариантов использования ALL является расчет процента меры. Хитрость заключается в том, чтобы выполнить вычисление этой меры один раз без ALL, а один раз с ALL, а затем разделить одно на другое! Теперь на мгновение подумайте, как бы вы сделали этот расчет, если бы не было функции ALL? Как бы вы узнали общую маржу, если маржа уже отфильтрована по категории Education? В этом сила ALL как функции, которая дает вам такую комбинацию.

 

ALL и Calculate

ALL также можно использовать в качестве входных данных для функции Calculate. Второй вход функции Calculate - это фильтр, а табличная функция действует как фильтр, в нашем случае ALL - это функция фильтра, которая фактически НЕ фильтрует! Неважно, где вы пишете свою функцию Calculate, какой бы фильтр ни применялся, он будет игнорироваться, если вы добавите в него функцию ALL.

 

Вариант использования для функции ALL: управление взаимодействием

Допустим, что при выборе элемента в слайсере вы не хотите, чтобы значения в определенной мере в визуальной таблице изменялись. Ну, теперь, когда вы знаете об ALL, кажется возможным, как это сделать.

 

Как вы можете видеть на приведенном выше снимке экрана, продажи фильтра даты влияют только на срез CalendarYear, а продажи фильтра продукта влияют только на цветной слайсер, однако на показатель продаж нескольких фильтров влияют оба!

 

Показатель

Слайсер

Фильтр продаж по дате

Дата

Фильтр продаж по продукту

Продукт

Фильтр продаж по нескольким параметрам

Дата и продукт

Вот скрипт для показателя фильтра продаж по дате, например:

 

5

6

7

Date Filter Sales = CALCULATE( SUM(FactInternetSales[SalesAmount]),

DATESBETWEEN(DimDate[FullDateAlternateKey],

FIRSTDATE(DimDate[FullDateAlternateKey]),

LASTDATE(DimDate[FullDateAlternateKey])

),

ALL(FactInternetSales)

)

Как видите, была использована функция ALL, поскольку в Calculate (DatesBetween) есть еще один фильтр, теперь выражение будет учитывать пересечение между этими двумя фильтрами. В результате в этом случае ALL будет игнорировать любые фильтры, поступающие из любых других таблиц, кроме DimDate.

Важна таблица, к которой применяется ALL

Не только важно использовать функцию ALL, но также важно использовать ее в нужной таблице. Например, если нам нужно получить общий объем продаж независимо от каких-либо фильтров, мы можем написать:

 

3

4

5

6

Total Sales = CALCULATE(

   SUM(FactInternetSales[SalesAmount]),

               ALL(

                   FactInternetSales

               )

)

Однако, если мы заинтересованы в достижении общих продаж всех клиентов, но затем разрешить прохождение всех остальных фильтров, мы можем написать:

 

1

2

3

4

5

6

Total Sales Customer = CALCULATE(

   SUM(FactInternetSales[SalesAmount]),

               ALL(

                   DimCustomer

               )

)

 

Во втором выражении мы использовали ALL (DimCustomer), а в первом - ALL (FactInternetSales). Это означает, что первое выражение будет игнорировать ЛЮБЫЕ фильтры. Однако второе выражение игнорирует только фильтры, поступающие из DimCustomer.

 

Функция ALLExcept: расширение

Иногда вы хотите игнорировать фильтр, поступающий из всех столбцов таблицы, за исключением одного или нескольких столбцов. Использование ALLExcept является хорошим вариантом для таких сценариев. Допустим, мы хотим, чтобы фильтр из Gender проходил, но фильтр из всех остальных столбцов будет игнорироваться. Мы можем написать выражение, используя ALLExcept, и использовать в нем Gender следующим образом:

 

1

2

3

4

5

6

Total Sales Except Gender = CALCULATE(

   SUM(FactInternetSales[SalesAmount]),

               ALLEXCEPT(

                   DimCustomer, DimCustomer[Gender]

               )

)

 

Резюме

Поскольку функциональность ALL кажется волшебной, эта статья была названа: “Теперь ты видишь меня! Варианты использования функции ALL в DAX и Power BI.” Функция ALL, несмотря на то, что она выглядит базовой и элементарной, является одной из самых важных и часто используемых функций в DAX. Основная функциональность ALL - игнорировать фильтры из одной таблицы. Вы можете использовать функцию ALL внутри других функций в качестве входных данных таблицы, и существует множество примеров, таких как вычисление процентов и перезапись взаимодействий мер, которые можно выполнить, просто используя функцию ALL. Если вы раньше не пользовались этой функцией, отнестись к ней серьезно.

No Comments

Add a Comment