Цитата |
---|
написал: Пытаюсь получить курсы валют с ЦБР. |
Шлюхогон42
12.09.2024 17:17:09
В общем, можете считать меня въедливым занудой, я сформулировал для себя такое правило.
Если внешний фильтр шире гранулярности первого аргумента итерационной функции, то он влияет только на этот аргумент и не влияет на меру во втором аргументе. Если же внешний фильтр Уже гранулярности первого аргумента, то он влияет и на первый аргумент функции и на меру во втором аргументе. А по сути мера во втором аргументе будет рассчитана только в контексте внешнего фильтра в этом случае. В случае с мерой:
по срезу месяц года действует 1-ое правило. Внешний фильтр - месяц шире гранулярности 1-го аргумента - дня, значит он фильтрует только 1-ый аргумент, а мера вычисляется только в контексте внутреннего фильтра: по каждому дню отфильтрованного месяца. В случае с мерой:
по срезу дня месяца года (например, 01.01.2007) действует 2-е правило. Внешний фильтр - день Уже гранулярности 1-го аргумента - месяца, значит он фильтрует и первый аргумент: VALUES('Date'[Month]) = "January" и второй аргумент - меру [Sales Amount], но по сути мера рассчитывается только по внешнему фильтру - 01.01.2007 Критика приветствуется.
Изменено:
Шлюхогон42
|
|||||
|
11.09.2024 18:27:57
Ваша проблема решена?
Изменено:
Шлюхогон42
|
|||||
|
11.09.2024 17:14:59
Воспользуйтесь формулой
Только предварительно надо в столбце [Keyword] заменить ошибки на "пусто". Сделать это надо потому, что у вас в этом столбце присутствуют: #ИМЯ? - Power Query такое очень не любит.
Изменено:
Шлюхогон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 И вот тут я не до конца понимаю, почему в первом случае внутренний фильтр по датам перебивает внешний по месяцам, а во втором внутренний фильтр по месяцам НЕ перебивает внешний по датам. Хотя логично всё звучит, но нету точного понимания, когда подобные временные фильтры перебивают один другой, а когда - дополняют друг друга. Если сможете мне это доходчиво объяснить - буду вам признателен! Ссылка на файл с примером -
Изменено:
Шлюхогон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 Помогите, пожалуйста, разобраться: какова правильная логика расчёта меры?
Изменено:
Шлюхогон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, однако формула выдаёт значения не накопительным итогом, а текущей строки столбца "Прибыль". Для того, чтобы убедиться в справедливости своей логики, я также создал вычисляемый столбец с накопительным итогом по товарам:
Как и ожидалось, в каждой строке идёт накопление товаров по изложенной выше логике. Вопрос: почему же не считается накопительный итог?
Изменено:
Шлюхогон42
|
|||||||
|
02.08.2024 19:41:28
Активная связь по умолчанию - Неактивная связь - На расчёт меры:
Шлюхогон42
|
|||||||
|
01.08.2024 17:08:24
Внешний же фильтр - Product[Brand] отработал на этапе фильтрации 2-го аргумента:
А не понимаю я исходя из той логики, которую я описывал на примере меры [Multiple Sales] - внешний фильтр по годам отработал на втором аргументе функции CALCULATE:
Изменено:
Шлюхогон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" пустые значения меры объяснены тем, что таблица с привязкой к дате заказа пытается отфильтровать таблицу с привязкой к дате доставки, но откуда вдруг появилась эта таблица с привязкой к дате заказа, когда в формуле задана привязка к дате доставки, я не понимаю. Помогите разобраться, пожалуйста! Ссылка на файл -
Изменено:
Шлюхогон42
|
|||||
|
25.07.2024 17:42:04
Далее этот список клиентов попадает как условие фильтра в итоговую формулу
Наверное, и эта инфа полезна для анализа: объём продаж по той же категории у тех же клиентов в последующие годы, но в данном случае дополнительный фильтр ALL('Product') в переменной VAR FirstYearCustomers решил задачу. Итоговая формула:
Изменено:
Шлюхогон42
|
|||||||||
|
25.07.2024 00:18:42
Убрал из формулы VALUES('Date'[Calendar Year Number])
Хотя я проверил на табличном выражении
1) определяем первый год продаж, 2) фильтруем клиентов по этому году 3) считаем продажи по отфильтрованному списку клиентов. Однако сама формула мне не понятна: 1) для чего в обеих переменных ALLSELECTED? 2) почему нужна функция KEEPFILTER? Поэтому я переписал формулу так, как я понимаю, и хочу разобраться, где именно я ошибся. А если просто тупо брать готовые шаблоны из книги без понимания - какой от этого смысл? Ссылка на файл -
Шлюхогон42
|
|||||||||
|