Есть 3 таблицы. 1 - факт и два справочника. Справочники имеют соответствующие связи с таблицей фактов 1 ко многим.
Необходимо провести расчет используя меру. Мера = (процедура1 * значение из справочника процедур1 ... + ... процедура(n) * значение из справочника процедур(n) ) / соответствующее значение из справочника по дате.
Как сделать первое действие я разобрался. В файле подготовлена модель данных.
Считает не правильно, так делит произведение по каждой строке, а нужно итоговое...
Скорее всего нужно использовать условия: Filter, If. Но у меня с ними пока туго в DAX. Возможно есть более красивое решение? Использовать вычисляемые столбцы не хочу, так как реальный массив довольно большой.
Vladimir Ch, К сожалению эта формула ничем не отличается от моей формулы в 3ем примере. Одну скобку впереди формулы я поставил ошибочно. Произведение таким образом делится также построчно. А нужно чтобы поделилось каждое итоговое по месяцу один раз на значение из соответствующего месяца
Сергей Жуков написал: Считает не правильно, так делит произведение по каждой строке, а нужно итоговое...
Не согласен. Иначе логика вообще не ясна.
Допустим, что выбран один месяц (в рамках которого одно значение в СправочинкДаты): Считаем построчно: x1/value + x2/value + .. + xn/value. В школе же учились? x1/value + x2/value + .. + xn/value = (x1 + x2 + .. + xn) / value. Поэтому построчно мы будем считать или нет - неважно
Допустим, выбрано 2 мес. Для простоты будем считать, что для каждого месяца по одной строке. Если бы Вы выбирали только первый месяц, то считали бы x1/150 Если бы Вы выбирали только второй месяц, то считали бы y1/160 Так какой результат нужен для двух (нескольких) месяцев? Почему не подходит x1/150 + y1/160 (построчно именно так и посчитает)?
P.S. Предложенный Vladimir Ch вариант в #5 посчитает аналогично построчному для одного месяца. Но для нескольких из всех значений в календаре в соответствии с выбранным периодом найдет максимальное и поделит на него. То есть из примера выше (x1+y1)/160. И? Результат за 2 месяца вообще ничего общего не имеет с результатами по месяцу. Где смысл такой метрики?
Я считаю, что какой-то бред. Для одного месяца разницы нет. А для нескольких ТС должен пояснить логику. Ну и бред же, что значение для процедур берем значение для именно этой процедуры, а для месяца (в случае нескольких месяцев) какое-то непонятное.
DIVIDE(
SUMX ( 'Таблица1'; 'Таблица1'[Процедура] * RELATED ( 'СправочникПроцедуры'[значение] ) );
MAX ( 'СправочникДаты'[Значение] )
)
Но в примере ТС увидим отличие Все потому, что даты выносятся не из справочника (помним о направлении фильтра). Сергей Жуков, в измерения выносите даты именно из справочника. Не нужно из таблиц фактов. Иначе совершите ошибки или придется сильно усложнять меры.
surkenny,попробую разжевать на примере. Логику самой меры пока не буду доводить. Она нам в общем-то и не нужна.
математическая формула:
Мера = (процедура1 * значение из справочника процедур1 + ... + процедура(n) * значение из справочника процедур(n) ) / соответствующее значение из справочника по дате.
Допустим берем апрель.
1)Нам нужно сначала перемножить значения таблицы фактов на значения таблицы справочника процедур (только за апрель) 2) делим получившееся значение на значение из таблицы дат.
То есть для процедуры 4 за месяц январь должно получиться: (32*10 + 1*10) / 150 = 2,2
Вы правы, что, деля строки в разрезе процедур вот так:
32*10 / 150 + 1 * 10 / 150 = 2,2
Дает то же значение. Но я так понимаю
Формула
Код
мера 2:=
SUMX (
'Таблица1';
'Таблица1'[Процедура] * RELATED ( 'СправочникПроцедуры'[значение] ) / RELATED ( 'СправочникДаты'[Значение] )
)
и
Код
=DIVIDE( SUMX ( 'Таблица1'; 'Таблица1'[Процедура] * RELATED ( 'СправочникПроцедуры'[значение] ));
MAXX('Таблица1'; RELATED ( 'СправочникДаты'[Значение] ) )
)
Дают нам не тот результат так как деление происходит непонятным образом.
в сводной мы видим значение 0,533333333 арифметикой я не смог его получить) Близко примерно так 32*10/(150+160+165+140) + 1*10 / (150+160+165+140) = 0,5365 Как будто почему то в расчет берутся даже не связанные значения по справочнику месяцев..
написал: Сергей Жуков , в измерения выносите даты именно из справочника. Не нужно из таблиц фактов. Иначе совершите ошибки или придется сильно усложнять меры.
Да, конечно. Только из справочника, в этом же и суть Related. Ваша упрощенная формула же делит только на максимальное значение из таблицы справочника дат.. Но даже если так, я все равно не понимаю, почему итоговое значение по 4ой процедуре за январь не 330 / 165 = 2
Сергей Жуков, Вы сами понимаете, что Вам ChatGPT написал? Удачи с вложенными итераторами на нормальных объемах:) Функцию EARLIER вообще нет смысла использовать с наличием переменных.
Цитата
Сергей Жуков написал: Да, конечно. Только из справочника, в этом же и суть Related.
При чем тут суть related? Ощущение, что Вы вообще не понимаете, что делаете У вас в примере месяцы в столбцах НЕ ИЗ СПРАВОЧНИКА!
P.S. Я промолчу о пользе значения меры chatGPT. Вы хотя бы поняли бы вначале, что Вам посчитать нужно. Скорее всего, результат похож на тот, что Вам нужен, но он неверный За такие меры я бы увольнял аналитиков В первой переменной 3 вложенных итерации, которые совсем ненужны. Это смерть Вашего отчета на большом объеме. Или, как минимум, боль пользователей от тормозов.
Vladimir Ch, не совсем. Для одного месяца - да. Результаты совпадут. Суть вычисления для двух месяцев в двух столбцах: x/a и y/b. Если же к таблице добавить столбец итогов (ну или столбцы не по месяцам, а по кварталам сделать), то Ваша мера считает x/a + y/b Мера ChatGPT - (x+y)/(a+b) На скрине отличия в итогах (в месяцах значения не отличаются).
Сергей Жуков, а теперь фокус. Я заменил месяцы на месяцы из справочника. И тормозной бред, сгенерированный ChatGPT, превращается в тривиальную меру.
Код
мера S:=
DIVIDE(
SUMX ( 'Таблица1'; 'Таблица1'[Значение] * RELATED ( 'СправочникПроцедуры'[значение] ) );
SUM ( 'СправочникДаты'[Значение] )
)
Согласитесь, что в таком случае прямо сразу вся логика меры понятна. А не трехэтажная хрень ChatGPT.
так я про то и писал, что описания расчета для нескольких месяцев нет. И поэтому считает данная мера правильно или нет, я лично не мог понять. Либо я не увидел это описание для группы месяцев..