Страницы: 1 2 След.
RSS
DAX: расчет значений с использованием констант
 
Здравствуйте!
Помогите, пожалуйста, справиться с мерами

Есть Справочник продуктов (Продукт1, Продукт2,…, Продукт8). Данные по некоторым продуктам находятся в исходных таблицах (Таб.1, Таб.2, Таб3)
Для каждой таблицы я делаю меру для выборки данных по продуктам (Мера1, Мера2, Мера3). Все эти меры свожу в одну итоговую меру Total=Мера1+Мера2+Мера3. В итоге получаю сводную таблицу, состоящую из Справочника и Одной меры Total

Вопрос, как быть если данные по некоторым продуктам должны рассчитываться не из исходных таблиц, а на основании данных по другим продуктам или являются константами? Не могу понять, как написать это условие...
Код
Например Продукт7=100, Продукт8=Продукт3*(Продукт7+Продукт6)
 
Решение в лоб:
Код
=var const = 100
var product3 = CALCULATE([Total];'СправочникПродуктов'[Справочник продуктов]="Продукт3")
var product6 = CALCULATE([Total];'СправочникПродуктов'[Справочник продуктов]="Продукт6")
return
SUMX(SUMMARIZE('СправочникПродуктов';'СправочникПродуктов'[Справочник продуктов];"1";[Total]);
   IF('СправочникПродуктов'[Справочник продуктов]="Продукт7";const;
      IF('СправочникПродуктов'[Справочник продуктов]="Продукт8";
         product3*(const+product6);[1])))
 
Vladimir Chebykin, спасибо! подскажите, а такую формулу можно в Power Pivot написать? или это для  PBI? не могу сообразить, как это мерах записать...
 
по-моему Вы все перепутали. это и есть мера DAX - она используется в выходных объектах (сводные таблицы Power Pivot, диаграммы PBI). Если Вы спрашиваете про вычисляемый столбец в модели данных, то она не для этого написана.
Скопируйте ее в меру той сводной таблицы, которую приложили в примере 1-ого сообщения.
Изменено: Vladimir Chebykin - 25.02.2020 15:59:38
 
Vladimir Chebykin, нет, я имел ввиду меру. Все правильно. Но я не понимаю, как эту меру записать в Power Pivot (с учетом var и return). я понимаю, что это объявление переменных, но как их в Power Pivot записать - не пойму. Ошибку пишет. Я поэтому и предположил, что их можно только в PBI использовать.
Вы не могли бы пожалуйста, свой вариант в Excel приложить
 
Во вложении: мера 1.
П.С. может при копировании у Вас образовался двойной значок "=" в первой строке?
Изменено: Vladimir Chebykin - 25.02.2020 16:01:40
 
Vladimir Chebykin,спасибо. Но у  меня ругается, не дает открыть(
Цитата
В скрипте многомерных выражений обнаружены одна или несколько ошибок.
MdxScript(Model) (6, 35) Неверный синтаксис "const"."
 
Vladimir Chebykin,
подтверждаю. Ошибка и невозможно открыть модель данных. Может от версии эксель зависит?
 
Эксель 2013?
Вот горшок пустой, он предмет простой...
 
PooHkrd,

Он, родимый.
 
Vladimir Chebykin, а можно этот пример реализовать без объявления переменных(var-return)?
Мне кажется, в 2013 этот прием не работает...
 
Student64,

Нагуглил, что var-return работает с 2016.
 
quasarrr, ну тогда продолжаем ожидать знатоков:)
 
Сильно в лоб:
Код
Мера:=SUMX(SUMMARIZE('СправочникПродуктов';'СправочникПродуктов'[Справочник продуктов];"1";[Total]);
   IF('СправочникПродуктов'[Справочник продуктов]="Продукт7";100;
      IF('СправочникПродуктов'[Справочник продуктов]="Продукт8";
         CALCULATE([Total];'СправочникПродуктов'[Справочник продуктов]="Продукт3")*(100+CALCULATE([Total];'СправочникПродуктов'[Справочник продуктов]="Продукт6"));[1])))
 
quasarrr,Спасибо!
Изначально мне казалось, это будет выглядеть проще*
Сложная конструкция в итоге. Сам бы точно не дошел до этого

*я в целом про прием, не про отбрасывание var-return
Изменено: Student64 - 25.02.2020 16:38:02
 
Уважаемые знатоки, подскажите, пожалуйста, можно ли реализовать этот расчет без использования SUMMARIZE? или это единственный прием для такой задачи? Тяжело для освоения на начальном этапе
 
Цитата
Student64 написал:
расчет без использования SUMMARIZE
Нужно понимать механизм работы модели данных PP и функций DAX. Кратко:в модели данных есть таблица фактов, вокруг которой строится анализ, а есть таблицы справочники, которые могут содержать дополнительную информацию (иерархию в типичном случае). Все это выстраивается в модель "звезда" или "снежинка". Так вот, в Вашей таблице фактов (которую анализируете) нет данных по продукту 7 и продукту 8. И ни при каких агрегациях они не появятся. Чтобы выйти из этой ситуации, мы создаем искусственную или виртуальную таблицу, в которой сами задаем значения для продукта 7 и продукта 8. А вот чтобы эту виртуальную таблицу создать, используют ф-ию SUMMARIZE. Можно и по другому решать подобные задачи, но на мой взгляд это самый простой.
 
Vladimir Chebykin, спасибо! Подскажите ещё,  пожалуйста. Вариант, который предложен выше без var и return корректен? Насколько я понял, при объявлении переменных они не реагируют на фильтры(контексты) формул в которых участвуют. Если мы не используем var и return, а пишем все единой формулой - то не пропущена ли функция обнуления фильтров?
 
Цитата
Student64 написал:
Вариант, который предложен выше без var и return корректен?
абсолютно корректен. Переменные просто позволяют сократить код, когда пишешь сложные функции. И второе преимущество: при вычислении мер в сводной таблице каждое значение в контексте строки сводной таблицы делает операцию вычисления меры. Переменная же позволяет один раз сделать какое-либо промежуточное вычисление и потом его использовать при следующих операциях вычисления внутри меры. Тем самым мы сокращаем время вычисления (выигрыш по времени будет зависеть от сложности самой меры и объема данных)
 
Цитата
Vladimir Chebykin написал:
при объявлении переменных они не реагируют на фильтры(контексты) формул в которых участвуют.
Переменная, есть часть конкретной меры и внутри нее нет никаких отличий по воздействию внешних фильтров. Т.е. внешний контекст фильтров, который Вы накладываете на сводную таблицу одинаково воздействует и на переменную и на другие функции внутри меры. А вот внутренний контекст фильтров (внутри меры) может меняться в зависимости применяемой функции (например, функция ALL не обращает внимание на наложенные внешние фильтры).
 
Vladimir Chebykin, спасибо. А можно было бы использовать вместо переменных дополнительные меры? Чтобы итоговая формула была менее громоздкой?
Формулы новых мер будут аналогичны формулам переменных в Вашем примере?
 
Цитата
Student64 написал:
А можно было бы использовать вместо переменных дополнительные меры?
Да, правильно мыслите.
 
Vladimir Chebykin, спасибо. Владимир, извините, поток вопросов не могу остановить... В моем примере участвует один справочник. Если кроме справочника продуктов есть ещё справочник по времени, то при написании формулы  Summarize этот справочник тоже нужно было включать?
 
Цитата
Student64 написал:
этот справочник тоже нужно было включать?
нет, не нужно. Только если Вы захотите создать искусственную дату, которая отсутствует в таблице фактов и присвоить ей какое-либо значение (как продукт 7, или 8 ).
Совет, если Ваши таблицы фактов однородны по своей структуре, объедините их в одну (например, с помощью Power Query) и грузите ее уже в модель данных. Тот пример, который Вы приложили с 3-мя таблицами фактов (исходные таблицы) - это костыль, так не нужно делать.
Изменено: Vladimir Chebykin - 27.02.2020 09:02:19
 
Цитата
Vladimir Chebykin написал:
Совет, если Ваши таблицы фактов однородны по своей структуре, объедините их в одну (например, с помощью Power Query)
Я для себя сделал вывод, что наоборот нет смысла все тащить в одну таблицу(как бы мы это делали в Excel) - ориентировался на эту статью http://baguzin.ru/wp/glava-20-power-query-v-pomoshh
Вы считаете, что объединение таблиц в PQ работает быстрее чем объединение через создание связей в модели PP?
Если использовать вариант PQ, то нельзя будет обновить один из источников - обязательно будут перегружаться все таблицы, входящие итоговое объединение
 
Student64, а без объединения вы теряете огромный массив функций с анализом временных рядов типа DATEADD SAMEPERIODLASTYEAR и тому подобных. С вашими костылями такой анализ делать замучаешься. Ни прогноза нормального не сделать ни аналитики, при добавлении новых таблиц-фактов все время переделывать связи и дописывать меры. Один гемор, короче. Лучше уж чутка подождать обновление, зато получить нормальную псевдоБД, с которой удобно работать.
Вот горшок пустой, он предмет простой...
 
Student64, советую повнимательнее еще раз перечитать статью, которую Вы привели. Беглого взгляда по статье мне было достаточно, чтобы понять что автор (Baguzin) сначала показывает, как загрузить 3 таблицы по отдельности в модель данных. Затем приводит пример объединения этих таблиц сразу в Power Query и грузить в PP уже объединенную таблицу. и пишет: "На самом деле, вам нужна только последняя объединенная таблица.". Т.е. грузим одну объединенную таблицу фактов, а не несколько.
А по поводу
Цитата

нельзя будет обновить один из источников - обязательно будут перегружаться все таблицы,
хозяин барин: либо подождать обновление всего запроса, либо писать 10-ки различных мер, хоть и однотипных (по кол-ву исходных таблиц) вместо одной. Это быстро надоест, когда меры (расчеты) будут становиться сложнее, а изменения/исправаления чаще  :)
 
PooHkrd, спасибо
Работа с датами тоже предстоит, но я думал, что если есть ровный справочник дат, то проблем с моим подходом тоже быть не должно
Видимо, тоже вернусь с вопросом, когда дойду
Изменено: Student64 - 27.02.2020 10:23:37
 
Vladimir Chebykin, понял, спасибо
Владимир, а как быть если у меня справочник Продуктов имеет иерархическую структуру Продукт-Группа Продукта
И в итоговой сводной я показываю именно иерархию а не отдельные компоненты структуры
В таком варианте у меня перестают работать формулы по конкретному продукту(например
Код
мераПродукт3:=CALCULATE([Total];'СправочникПродуктов'[Справочник продуктов]="Продукт3")
)
Точнее, они работают но только для этого продукта. Выделил красным

файл не могу загрузить...

upd: пока дошел до такого варианта - перечисление всех уровней в фильтре. Немного пугает такой способ, так как в боевой версии Иерархия состоит из 10 уровней... Надеюсь, есть более оптимальный способ
Код
мераПродукт3:=CALCULATE([Total];'СправочникПродуктов'[Справочник продуктов]="Продукт3";'СправочникПродуктов'[ГруппаПродуктов]="ГруппаПродуктов1")
Изменено: Student64 - 27.02.2020 10:19:09
 
Цитата
Student64 написал:
как быть если у меня справочник Продуктов имеет иерархическую структуру
в функции Summarize необходимо перечислить все нужные группировочные поля иерархии. Сейчас у Вас там только "продукт" указан.
....SUMMARIZE('СправочникПродуктов';'СправочникПродуктов'[Справочник продуктов];здесь вставить поле;здесь вставить еще поле;"1";[Total])
Изменено: Vladimir Chebykin - 27.02.2020 10:35:49
Страницы: 1 2 След.
Наверх