Страницы: 1
RSS
Dax Power Pivot - Разные меры для разных строк таблицы
 
Здравствуйте господа!
Упорно и упрямо стараюсь освоить и PQ и PP
На данный момент все еще нет нормального понимания того, что такое мера и как ее едят.
Не понятна суть фильтров. Не могу переключить логигу головного мозга на другую системную ветку.

Во вложении фаил, пожалуйста подскажите каким образом возможно для разных строк рассчитать разные меры.

Еесть фаил с движением, товарным, суммовым, не важно. Нужно в одной таблице отразить и обороты - сами движения и их виды, и остатки на каждый день операции, и итоги по месяцам, по годам и так далее.
Попытался сам поковырять, ничего не получается, не могу уловить суть фильтраций и отборов.
А также логики работы IF при выборе меры для конкретного значения конкретной строки.
также не совсем понятно, если я добавлю еще один уровень в столбец с движением, скажем "Ответсвенный за операцию", или Автор документа. То все меры слетят, и их фильтры надо выставлять заново?
 
Пример, приложили - это хорошо. Еще лучше будет, если руками набросаете таблицу: конечный желаемый результат на выходе. Пока только поправил меру с расчетом остатка.
 
Vladimir Chebykin, Спасибо за Ваше Участие!
Таблица ведь приложена! Номер три - разноцветная такая! Самая последняя!
Нужно чтобы она была заполнена соответсвующими значениями, значения остатков из таблицы 2.
Значения оборотов из таблицы 1.
Кроме того, к сожалению, в Вашем варианте таблица 2 считается некорректно.
Если так сказать.
Нужно остаток считать в строке Остаток, а не во всех строчках.






Приложил Фаил.
Изменено: lostandleft - 27.02.2020 11:51:51 (Приложил Фаил)
 
попробуйте такую конструкцию:
Код
=IF(HASONEVALUE('Таблица1'[Движение]);
   SWITCH(VALUES('Таблица1'[Движение]);
      "Продажи";CALCULATE(SUM([Сумма]);'Таблица1'[Движение]="Продажи");
      "Остаток";CALCULATE(SUM([Сумма]);FILTER(ALL('Calendar');
            'Calendar'[Date]<=MAX('Calendar'[Date]));
            'Таблица1'[Движение]="Остаток");
      "Списание";CALCULATE(SUM([Сумма]);'Таблица1'[Движение]="Списание");
      BLANK()
      )
   )
 
и еще, пример таблицы A2:D22 не соответствует таблице в модели данных, поэтому результаты разные.
 
Цитата
Vladimir Chebykin написал:
и еще, пример таблицы A2:D22 не соответствует таблице в модели данных, поэтому результаты разные.
Конечно не соответствует! В таблице данных, задвоенные значения!!! Это сделано специально для того, чтобы посчитать остаток.

К сожалению, мне не пришло в голову как  поместить строку "Остаток" в таблицу значений иным способом.
Может быть Вы можете подсказать более элегантное решение? В одной сводной таблице нужно видеть и обороты и остатки. Это итоговая задача.

Этот код хороший,
Код
=IF(HASONEVALUE('Таблица1'[Движение]);
   SWITCH(VALUES('Таблица1'[Движение]);
      "Продажи";CALCULATE(SUM([Сумма]);'Таблица1'[Движение]="Продажи");
      "Остаток";CALCULATE(SUM([Сумма]);FILTER(ALL('Calendar');
            'Calendar'[Date]<=MAX('Calendar'[Date]));
            'Таблица1'[Движение]="Остаток");
      "Списание";CALCULATE(SUM([Сумма]);'Таблица1'[Движение]="Списание");
      BLANK()
      )
   )
однако у него ряд недостатков:
1 - недостаток, он не отражает остатки на те даты в которые не проходили операции. Однако, если операции не проходят остаток все равно должен быть.
2 - недостаток в том, что я его не понимаю, Вы не могли бы разбить его на несколько мер, и также как и я в своем файле, сделать итоговую меру с названием Результат, чтобы я понимал в каком случае что именно считается.  :cry:

Я стараюсь, но не получается. И еще лучше, если Вы по русски прокомментируете то что получилось....извините за назойливость. Хочу не просто решение, хочу научиться.
 
Vladimir Chebykin, ТАкже, предполагаю, что Код С явным указанием свич на виды движений - не слишком правильное решение.
А если видов движений будет 10 - 14?
У меня только одно уникальное поле - остаток, и для него нужна уникальная формула, остальные поля должны обрабатываться по шаблону.
Ну, или В крайнем случае могу таблицу Видов движения загружать через PQ.
 
по пункту 1 - вернитесь к сообщению №2 и ответьте на вопрос про остаток из того приложенного примера (таблица 2)
Цитата
Vladimir Chebykin написал:
Пока только поправил меру с расчетом остатка.
. Это решение по остатку Вы не прокомментировали.
по пункту 2 - можно разбить на подмеры, но только те части, которые с функцией Calculate. Скопируйте их в отельные меры, а затем вставьте уже сами меры по их названию, чтобы упростить конструкцию.
что касается части:
Код
IF(HASONEVALUE('Таблица1'[Движение]);
   SWITCH(VALUES('Таблица1'[Движение])

поизучайте вот эту статью от буржуев, там описан механизм работы. У меня просто сил не осталось на опасательную часть работы DAX. В соседней теме ответил на 10-ок вопросов по DAX-у, больше не могу не хочу.
Изменено: Vladimir Chebykin - 27.02.2020 12:50:50
 
Цитата
lostandleft написал:
остальные поля должны обрабатываться по шаблону
шаблон можно вставить вместо Blank() в приведенной мере и будет Вам счастье результат.
 
Цитата
Vladimir Chebykin написал:
Это решение по остатку Вы не прокомментировали.

На фото прокомментаровал так, как все должно быть в итоге.
Вариант с ручным переключением Свич - не подходит. Видов движения может быть масса. И для разных документов они могут быть различными.
А формула нужна, на все случаи жизни (на все таблицы) желательно одна.
Поэтому ручной свич, к сожалению - не вариант.  
Изменено: lostandleft - 27.02.2020 14:12:20
 
Вариант во вложении. Мера выглядит так:
Код
=var tru = 
// эта переменная нужна для определения таблицы истинности пересечения всех строк таблицы с движением ="остаток" и всех дат календаря. При этом не зависеть от таблицы фактов и доп. столбца "ТМЦ". Она нужна для корректного расчета в одной мере и накопительного итога, и просто суммы.
CALCULATE(COUNTROWS(
   CROSSJOIN(
                FILTER(VALUES('Таблица1'[Движение]);'Таблица1'[Движение]="Остаток");
      'Calendar')
      );
   ALL('Таблица1'[ТМЦ]))
return
//сравниваем, если движение = остаток, то сумма накопительным итогом, иначе просто сумма во всех остальных случаях.
IF(tru;
// если ИСТИНА
   CALCULATE(SUM([Сумма]);FILTER(ALL('Calendar');'Calendar'[Date]<=MAX('Calendar'[Date])));
// если ЛОЖЬ
   SUM([Сумма]))
 
Vladimir Chebykin, Огромное спасибо Вам за потраченное время!
Я то думал что хоть что-то начал понимать в этом...ам...оказывается, "Чем дальше в лес, тем злее дровосеки!"
Буду разбираться.

Спасибо еще раз, особенно за комментарии!
 
Пожалуйста, Ваша задача оказалась очень не обычной сочетанием двух моментов: 1. Разные варианты расчетов в зависимости от контекста строк сводной таблицы. 2. Расчет накопительным итогом. По отдельности эти вопросы разбирались много раз. Но вместе - я не припомню. И оказывается, при объединении этих задач классическое решение не работает! Пришлось изобретать велосипед
Страницы: 1
Наверх