| Цитата |
|---|
написал: Вы, наверное, не совсем внимательно читали книгу, т.к. там написано (стр. не скажу, доступа к ней в данный момент нет), что при фильтрации по первичному ключу таблицы "Календаря" (в Вашем случае 'Date'[Date]) неявно накладывается модификатор ALL("Календарь"). |
Ох!

)))) Ну уж это я помню, как и то, что вообще любой фильтр в функциях CALCULATE(-TABLE) по какому-либо столбцу автоматически заворачивает условие фильтрации в функцию FILTER:
| Код |
|---|
FILTER(
ALL(Ст-ц),
Ст-ц = (<,>,<>,<=,>=) ....)
|
А в случае с фильтрацией по 'Date'[Date] ещё и добавляет по умолчанию условие ALL('Date')
Только в примерах моих мер функция CALCULATE напрямую вообще не задействована и присутствует лишь как обязательное дополнение к мере [Sales Amount]
| Цитата |
|---|
написал: На уровне месяца января, соответственно 31 дата для вычисления в VALUES('Date'[Date]) и.т.д. Т.е. контексты внутренний и внешний накладываются друг на друга. Где они перебиваются, я не понимаю. |
Да вот взять хотя бы пример из видео Руссо. Там мера:
| Код |
|---|
AVERAGEX(
Customer,
[Sales Amount])
|
рассчитывается в контексте внешнего фильтра - Product[Brand].
Таблицы Product и Customer напрямую не связаны, то есть первый аргумент - таблица Customer внешний контекст фильтра не примет, то есть вернёт всю таблицу Customer целиком.
А вот мера [Sales Amount] примет и внешний контекст фильтра - Product[Brand], и внутренний контекст фильтра - каждая строка таблицы Customer.
Понятно, что при итерациях по таблице Customer будут пустые строки:
1) либо потому, что данный клиент совсем не совершал покупок;
2) либо потому, что по данному клиенту покупки есть, но с дополнительным внешним фильтром по бренду - их нет.
Но функция AVERAGEX игнорит пустые значения, поэтому можно быть уверенным, что расчёт будет верным.
Теперь, что я имею в виду под высказыванием "внутренний фильтр перебивает внешний". И тут заранее прошу меня извинить, если иные мои выводы покажутся вам надругательством над логикой и смысловым извращением.
Возьмём первую меру
| Код |
|---|
Max Sales Date :=
MAXX(
VALUES('Date'[Date]),
[Sales Amount]) |
в разрезе Года / месяца - например, января 2007-го. Повторю то, что писал выше
1-й аргумент VALUES('Date'[Date]) принимает внешний контекст фильтра - январь 2007-го
2-й аргумент мера [Sales Amount] принимает:
1) внешний контекст фильтра - январь 2007-го;
2) внутренний контекст фильтра - каждый день января 2007-го: с 1-го января по 31-е января
И вот тут попробуем наложить внешний контекст фильтра на внутренний
Мера [Sales Amount] должна одновременно посчитаться по 1-му января и по всему месяцу январь - вот в точности, как в том примере у Руссо. Но это абсурд, поэтому рассчитывается она только по датам (датам января 2007-го, так как VALUES('Date'[Date]) приняла на себя внешний фильтр по месяцу года). Вот именно это я и имею в виду под "внутренний фильтр перебивает внешний"
Но почему же тогда не абсурд, что во второй мере:
| Код |
|---|
Max Sales Month :=
MAXX(
VALUES('Date'[Month]),
[Sales Amount]) |
в разрезе даты месяца года - 01.01.2007 мера [Sales Amount] принимает:
и внешний фильтр - дата 01.01.2007
и внутренний фильтр - месяц январь (так как внешний фильтр по дате 01.01.2007 отфильтровал первый аргумент VALUES('Date'[Month]) по месяцу "January")
Я вот этого до конца понять не могу. Почему в первой мере нельзя друг на друга наложить внешний и внутренний фильтр, а во второй - можно?
Почему, грубо говоря, в первой мере мы не можем посчитать [Sales Amount] одновременно по месяцу и дню, а во второй мере - можем?
Понимаете, что я не понимаю?