Наверное, это как-то можно реализовать макросом. Я сделал с помощью Power Query. Обновляете и получаете результат.
Шлюхогон42
|
25.02.2025 17:36:58
AlienSx, это работает только в разрезе ПТиУ - Товар, а в разрезе ПТиУ - уже нет, к сожалению.
Шлюхогон42
|
|
|
|
|
|
11.09.2024 18:27:57
Ваша проблема решена?
Изменено: - 11.09.2024 18:28:20
Шлюхогон42
|
|||||
|
|
|
|
11.09.2024 17:14:59
Воспользуйтесь формулой
Только предварительно надо в столбце [Keyword] заменить ошибки на "пусто". Сделать это надо потому, что у вас в этом столбце присутствуют: #ИМЯ? - Power Query такое очень не любит.
Изменено: - 11.09.2024 17:15:12
Шлюхогон42
|
|||
|
|
|
|
11.09.2024 16:22:01
Только в примерах моих мер функция CALCULATE напрямую вообще не задействована и присутствует лишь как обязательное дополнение к мере [Sales Amount]
Таблицы Product и Customer напрямую не связаны, то есть первый аргумент - таблица Customer внешний контекст фильтра не примет, то есть вернёт всю таблицу Customer целиком. А вот мера [Sales Amount] примет и внешний контекст фильтра - Product[Brand], и внутренний контекст фильтра - каждая строка таблицы Customer. Понятно, что при итерациях по таблице Customer будут пустые строки: 1) либо потому, что данный клиент совсем не совершал покупок; 2) либо потому, что по данному клиенту покупки есть, но с дополнительным внешним фильтром по бренду - их нет. Но функция AVERAGEX игнорит пустые значения, поэтому можно быть уверенным, что расчёт будет верным. Теперь, что я имею в виду под высказыванием "внутренний фильтр перебивает внешний". И тут заранее прошу меня извинить, если иные мои выводы покажутся вам надругательством над логикой и смысловым извращением. Возьмём первую меру
1-й аргумент VALUES('Date'[Date]) принимает внешний контекст фильтра - январь 2007-го 2-й аргумент мера [Sales Amount] принимает: 1) внешний контекст фильтра - январь 2007-го; 2) внутренний контекст фильтра - каждый день января 2007-го: с 1-го января по 31-е января И вот тут попробуем наложить внешний контекст фильтра на внутренний Мера [Sales Amount] должна одновременно посчитаться по 1-му января и по всему месяцу январь - вот в точности, как в том примере у Руссо. Но это абсурд, поэтому рассчитывается она только по датам (датам января 2007-го, так как VALUES('Date'[Date]) приняла на себя внешний фильтр по месяцу года). Вот именно это я и имею в виду под "внутренний фильтр перебивает внешний" Но почему же тогда не абсурд, что во второй мере:
и внешний фильтр - дата 01.01.2007 и внутренний фильтр - месяц январь (так как внешний фильтр по дате 01.01.2007 отфильтровал первый аргумент VALUES('Date'[Month]) по месяцу "January") Я вот этого до конца понять не могу. Почему в первой мере нельзя друг на друга наложить внешний и внутренний фильтр, а во второй - можно? Почему, грубо говоря, в первой мере мы не можем посчитать [Sales Amount] одновременно по месяцу и дню, а во второй мере - можем? Понимаете, что я не понимаю?
Шлюхогон42
|
|||||||||||||
|
|
|
|
11.09.2024 02:24:32
Я никак до конца не могу уяснить, в каких случаях на меру во втором аргументе итерационной функции действует только внутренний контекст фильтра таблицы в первом аргументе, а в каких ещё и внешний контекст фильтра. Корни этого непонимания растут вот откуда. Есть мера, рассчитывающая максимальные продажи в гранулярности дат:
1-й аргумент VALUES('Date'[Date]) принимает внешний контекст фильтра - январь 2007-го 2-й аргумент мера [Sales Amount] принимает: 1) внешний контекст фильтра - январь 2007-го; 2) внутренний контекст фильтра - каждый день января 2007-го: с 1-го января по 31-е января Внутренний контекст фильтра перебивает внешний, так как нельзя же одновременно вычислить продажи по месяцу и по дню Теперь как работает мера "Max Sales Month", но уже в разрезе Года / месяца / дня - например, 1-го января 2007-го года 1-ый аргумент VALUES('Date'[Month]) принимает внешний контекст фильтра - 01.01.2007. Таким образом для 01.01.2007 - VALUES('Date'[Month]) = "January" 2-ой аргумент мера [Sales Amount] принимает: 1) внешний контекст фильтра - 01.01.2007; 2) внутренний контекст фильтра - месяц "January" Тут как раз ситуация аналогична с моим первым примером про категории и подкатегории, то есть оба фильтра - и внешний и внутренний - накладываются на меру - январь и 01.01.2007, то есть мера рассчитывается по 01.01.2007 И вот тут я не до конца понимаю, почему в первом случае внутренний фильтр по датам перебивает внешний по месяцам, а во втором внутренний фильтр по месяцам НЕ перебивает внешний по датам. Хотя логично всё звучит, но нету точного понимания, когда подобные временные фильтры перебивают один другой, а когда - дополняют друг друга. Если сможете мне это доходчиво объяснить - буду вам признателен! Ссылка на файл с примером -
Изменено: - 11.09.2024 02:26:05
Шлюхогон42
|
|||||||
|
|
|
|
08.09.2024 18:02:50
Здравствуйте!
Прошу помощи в решении очередного вопроса по DAX. Есть таблица Product, где содержится информации о товарах: названия, бренды, цвета, категории и подкатегории. Создал простую меру:
Создал меру посложнее:
1) в разрезе категорий - аналогично предыдущей мере; 2) в разрезе подкатегорий - рассуждаю так: На первый аргумент VALUES('Product'[Category]) влияет фильтр по подкатегории. Подкатегория фильтрует категорию, в которую она входит. Для "Bluetooth Headphones" - это категория "Audio". На второй аргумент CALCULATE(DISTINCTCOUNT('Product'[Subcategory])) влияет внешний фильтр - подкатегория "Bluetooth Headphones" и внутренний фильтр - категория "Audio". Внутренний фильтр важнее внешнего, значит CALCULATE(DISTINCTCOUNT('Product'[Subcategory])) должен рассчитываться по категории "Audio" Таким образом по каждой подкатегории: "Bluetooth Headphones", "MP4&MP3" и т.д. значение меры должна быть 3, но выдаёт почему-то 1 Помогите, пожалуйста, разобраться: какова правильная логика расчёта меры?
Изменено: - 08.09.2024 18:03:50
Шлюхогон42
|
|||||
|
|
|
|
06.09.2024 00:23:29
До меня дошло, наконец, что CALCULATE(SUM('Товары'[Прибыль]) примет ещё и внешний К.Ф., преобразованный из К.С., и помимо фильтра по столбцу "Товар" будет фильтроваться остальными столбцами: "Категория", "Прибыль" и т.д. Таким образом нужно ограничить внешний фильтр столбцом "Товар" и снять с остальных столбцов. Формула:
Шлюхогон42
|
|||||
|
|
|
|
05.09.2024 20:06:36
Здравствуйте, коллеги!
Для последующего ABC-анализа нужно посчитать накопительный итог по товарам. Обычно создавал вычисляемый столбец с помощью функции FILTER:
Всё корректно считает. Затем я попробовал ради эксперимента использовать вместо FILTER функцию CALCULATETABLE.
Опишу логику формулы. CALCULATETABLE в отличие от FILTER инициирует преобразование К.С. в К.Ф., следовательно на выражение VALUES('Товары'[Товар]) действуют следующие внешние фильтры: 1. Значение в текущей строке по столбцу "Категория". 2. Значение в текущей строке по столбцу "Прибыль". Второй и третий аргументы функции CALCULATETABLE задают внутренние фильтры: 1. Фильтровать только по столбцу "Прибыль", игнорить фильтры по остальным столбцам. 2. Весь столбец "Прибыль" (по умолчанию действует доп. условие - ALL( 'Товары'[Прибыль]) ) отфильтровать так, чтобы остались только те значения, что равны или превышают значение в текущей строке столбца "Прибыль". Внутренний фильтр перебивает внешний, и в итоге остаются только те строки столбца 'Товары'[Товар], что удовлетворяют условиям 2-го и 3-го аргументов функции CALCULATETABLE Далее в функции SUMX происходит преобразование К.С. в К.Ф. посредством функции CALCULATE, и значение SUM('Товары'[Прибыль]) рассчитывается по каждой строке отфильтрованного столбца VALUES('Товары'[Товар]), а затем все вычисленные значения прибыли суммируются. По сути логика та же, что и с функцией FILTER, однако формула выдаёт значения не накопительным итогом, а текущей строки столбца "Прибыль". Для того, чтобы убедиться в справедливости своей логики, я также создал вычисляемый столбец с накопительным итогом по товарам:
Как и ожидалось, в каждой строке идёт накопление товаров по изложенной выше логике. Вопрос: почему же не считается накопительный итог?
Изменено: - 05.09.2024 20:06:53
Шлюхогон42
|
|||||||
|
|
|
|
02.08.2024 19:41:28
Активная связь по умолчанию - Неактивная связь - На расчёт меры:
Шлюхогон42
|
|||||||
|
|
|
|
01.08.2024 17:08:24
Внешний же фильтр - Product[Brand] отработал на этапе фильтрации 2-го аргумента:
А не понимаю я исходя из той логики, которую я описывал на примере меры [Multiple Sales] - внешний фильтр по годам отработал на втором аргументе функции CALCULATE:
Изменено: - 01.08.2024 22:16:57
Шлюхогон42
|
|||||||||||||||
|
|
|
|
31.07.2024 17:56:41
Вот привожу вам выдержку из книги "Подробное руководство по DAX":
Вот на основании этого я и делаю вывод, показанный тут -
Напомню, мой вопрос по формуле меры:
Шлюхогон42
|
|||||||||
|
|
|
|
30.07.2024 18:21:00
И если это так, тогда я не понимаю, откуда взялся внешний фильтр по годам на 1-ый аргумент функции CALCULATE - [Sales Amount] в мере [Delivered Amount] по связи Sales[OrderDate] с 'Date'[Date] ?
Шлюхогон42
|
|||||||
|
|
|
|
30.07.2024 00:44:27
Большое спасибо за ваш ответ!
Таблица Sales фильтруется по внутреннему фильтру Quantity и внешнему Brand и поступает как внутренний фильтр для меры [Sales Amount]. Внешний же фильтр по Brand на меру [Sales Amount] не действует, потому что таблица Sales - расширенная таблица относительно таблицы Product, в которой присутствует столбец Product[Brand], а значит таблица Sales содержит этот столбец. Получается, что таблица Sales, уже отфильтрованная по Brand, перебивает внешний фильтр по Brand. На конечный результат эти тонкости не влияют, цифры получились бы одинаковые и в том случае, если бы [Sales Amount] фильтровалась внешним фильтром по Brand - внешний фильтр совпал бы с внутренним и на вычисления не повлиял. Но вот в этой мере
Таблица Sales, привязанная к таблице 'Date' по связи Sales[Delivery Date] с 'Date'[Date], уже отфильтрована по году - году доставки. Столбец с годом присутствует в таблице Sales, так как она расширенная относительно таблицы 'Date'. Значит таблица Sales, отфильтрованная по году доставки, поступает как внутренний фильтр для меры [Sales Amount], а внешний фильтр по годам на меру [Sales Amount] не действует, так как внутренний фильтр - расширенная таблица Sales со столбцом [Calendar Year] - перебивает внешний.
Шлюхогон42
|
|||||||||
|
|
|
|
26.07.2024 19:07:19
Здравствуйте, знатоки DAX!
Подскажите, пожалуйста, логику вычисления меры, заданной с помощью функции CALCULATE и фильтром по таблице, а не столбцу. Пример меры:
Объясню, как я понимаю логику работы этой меры. 1. Таблица Sales фильтруется по Brand, далее фильтруется по количеству Quantity больше 1. 2. Отфильтрованная таблица поступает как условие фильтра для меры [Sales Amount] И тут у меня вопрос: правильно ли я понимаю, что внешний фильтр по брендам не действует на меру [Sales Amount], так как таблица Sales уже отфильтрована по Brand, а так как таблица Sales расширенная по отношению к таблице Product, то включает связанный столбец Product[Brand] ? Если так, тогда я не понимаю, почему другая мера:
Ведь тут же по идее та же логика. 1. Таблица Sales связана с таблицей 'Date' по дате доставки. 2. Таблица Sales, связанная с таблицей 'Date' по дате доставки, фильтруется по году из внешнего контекста фильтра. 3. Отфильтрованная таблица Sales поступает как условие фильтра для меры [Sales Amount] Получается, что внешний фильтр по годам не действует на меру [Sales Amount], так как таблица Sales расширенная по отношению к таблице 'Date' и включает годы (годы доставки). В книге "Подробное руководство по DAX" пустые значения меры объяснены тем, что таблица с привязкой к дате заказа пытается отфильтровать таблицу с привязкой к дате доставки, но откуда вдруг появилась эта таблица с привязкой к дате заказа, когда в формуле задана привязка к дате доставки, я не понимаю. Помогите разобраться, пожалуйста! Ссылка на файл -
Изменено: - 26.07.2024 19:09:25
Шлюхогон42
|
|||||
|
|
|