Расчет недельных продаж с помощью DAX в LuckyTemplates
В этом руководстве показано, как в конечном итоге можно рассчитать разницу между еженедельными результатами продаж с помощью DAX в LuckyTemplates.
В этом сообщении блога мы собираемся рассмотреть вопрос, который был задан на форуме LuckyTemplates, и использовать технику LuckyTemplates на языке DAX для его решения. Если вы хотите продолжить и загрузить файлы, просто посетите форум LuckyTemplates и перейдите по . Вы можете посмотреть полное видео этого урока в нижней части этого блога.
Чтобы объяснить сценарий, который мы собираемся рассмотреть, у нас есть простая таблица в качестве примера. В первом столбце у нас финансовый уровень 1 . Во втором столбце у нас есть дата с именем Completed. В последнем столбце у нас есть комбинация финансового уровня и даты завершения, которую мы назовем Revenue .
Затем у нас есть слайсер для даты и имени клиента .
Что мы хотим сделать для определенного периода времени, так это определить три верхних даты, которые не равны нулю. И затем в этих трех главных датах мы хотим определить финансовый уровень.
В первой версии меры я перечислил даты, которые меньше 29.04.2021, когда у нас есть некоторый доход.
И в эти даты мы хотим определить финансовые уровни, которые принесли некоторый доход. Я объясню вам, как мы можем добиться этого расчета.
Оглавление
Моделирование данных
Прежде чем писать фактический DAX, давайте кратко рассмотрим модель данных, которая содержит несколько таблиц. Нас интересуют только таблица дат , таблица данных , таблица категорий вакансий и таблица клиентов .
Обратите внимание, что таблица Customer не очень важна, потому что она используется только внутри слайсера.
Показатель дохода рассчитывается в таблице данных. Категория «Работа» содержит финансовый уровень, который у нас есть в матрице. Затем мы используем столбец Date из таблицы Date в нашем слайсере.
Версия 1
Давайте избавимся от всего с матрицы и начнем с нуля. Я собираюсь создать новую меру и назвать ее V1, потому что это будет первая версия. Мы также рассмотрим два других варианта.
Подготовка контекста фильтра
Первое, что мы собираемся сделать, это получить все значения финансового уровня из контекста фильтра. Мы создадим и назовем ее FinancialLevelInFilterContext .
Чтобы получить значения из контекста фильтра, мы собираемся использовать в таблице категорий вакансий, которая содержит столбец финансового уровня. Затем нам нужно создать еще одну переменную и назвать ее Result . Затем напишите и тоже закройте.
В первом аргументе у нас есть выбор над срезом даты. В этих датах мы хотим определить даты, которые не имеют 0 и имеют хотя бы некоторый доход.
Если вы хотите получить доступ ко всем датам, выбранным в этом слайсере, нам нужно использовать для таблицы Date.
И поскольку у нас есть финансовый уровень в матрице, нам также нужно убедиться, что мы удаляем это конкретное значение из контекста фильтра. Мы можем использовать над категорией Job, а затем написать Financial Level 1.
Теперь, когда наш контекст фильтра подготовлен, мы можем написать самое внутреннее вычисление для CALCULATE. Во-первых, мы объявим переменную, которая будет комбинацией столбца финансового уровня и даты, как мы видели в первой таблице.
Затем мы воспользуемся и воспользуемся таблицей данных, чтобы обобщить эти две таблицы: категорию работы и таблицу дат.
Это обеспечит комбинацию финансового уровня и столбца даты, который существует в таблице данных. Затем мы собираемся создать еще одну переменную, в которой мы будем хранить значение строки дохода для первой созданной нами переменной.
Имя этой переменной будет FinancialLevelAndDatesWithRevenue . Код этой переменной будет над предыдущей переменной. Затем мы создадим виртуальный столбец, который будет Revenue, чтобы инициировать переход контекста. Итак, для каждой строки этой переменной мы присвоили доход.
Эта таблица содержит доход, который также равен нулю. Нам нужно отфильтровать эти строки с нулем. Для этого мы можем создать еще одну переменную и назвать ее RemoveZeroes .
Воспользуемся для предыдущей переменной, затем убедимся, что доход не будет равен нулю. Он может быть больше нуля или меньше нуля, но не должен быть строго равен нулю.
А затем мы собираемся получить дату из переменной RemoveZeroes . Для этого мы можем создать еще одну переменную и назвать ее KeepOnlyDates .
Я могу использовать , чтобы избавиться от повторяющихся дат, возвращаемых .
Далее мы собираемся определить три лучшие даты в порядке убывания. Мы будем использовать другую переменную и назовем ее Last3Dates , а затем воспользуемся .
Затем мы будем использовать для последних трех дат в столбце даты, а затем использовать разделитель.
Давайте перетащим нашу недавно созданную меру внутрь этой матрицы. Результат, который мы получаем: 31.03.2021, 04.07.2021 и 04.02.2021. Это означает, что наша мера работает.
Вернемся к редактору и избавимся от части RETURN CONCATENATEX. Чтобы получить эти последние три даты, мы можем проверить, какие строки из переменной RemoveZeroes на самом деле являются частью этих последних трех дат.
И для этого мы создадим еще одну переменную DatesInLast3Dates и используем функцию FILTER для RemoveZeroes . Это вернет таблицу, состоящую из категории работы и даты.
Мы суммируем столбец дохода, который мы создали в этой таблице. Давайте вернем SUMX для DatesInLast3Dates, а затем суммируем столбец дохода.
При таком расчете мы получаем только одно значение для каждой строки, потому что мы удалили категорию «Работа» из контекста фильтра.
Мы будем использовать переменную, которую мы создали в начале, чтобы проверить, доступна ли каждая строка переменной DatesInLast3Dates в контексте фильтра. Мы можем написать еще одну переменную и назвать ее IsInFilterContext .
Это отфильтрует даты в переменной DatesInLast3Dates . Затем я верну SUMX в контексте IsInFilter и суммирую столбец дохода.
Как только мы нажмем Enter , вы увидите, что мы получаем тот же результат, что и в начале.
Проверка результата вычисления LuckyTemplates на языке DAX
Чтобы убедиться, что мы действительно получаем правильный результат, мы можем создать новую таблицу CALCULATE, которая поможет нам в отладке, идентификации и проверке того, что код, который мы написали до сих пор, действительно возвращает правильный результат.
Давайте создадим копию кода, который мы написали до сих пор. Я просто скопирую часть, выделенную ниже, вернусь, чтобы создать новую таблицу, и вставлю выделенный код. Мы не будем утруждать себя именованием этой таблицы, так как она нам неинтересна.
И мы можем просто написать RETURN DatesInLast3Dates . Если я нажму Confirm , мы получим таблицу, но мы знаем, что на самом деле она пока не возвращает правильный результат, потому что нам действительно нужно имитировать поведение слайсера.
Мы можем обернуть этот код внутри CALCULATETABLE и сделать отступ для всего. В последней части я напишу, что дата должна быть больше или равна 2021-03-15 и что имя клиента должно быть равно DHL Supply Chain .
Таблица, которую мы создали внутри этой меры, фактически возвращает правильный результат. Мы можем использовать CALCULATETABLE для проверки виртуальной таблицы, которую вы создаете в своем расчете.
Другие вычисления LuckyTemplates на языке DAX
Теперь, когда мы знаем, что наш расчет работает, и понимаем, что на самом деле происходит за кулисами, мы можем рассмотреть другие методы для решения той же задачи. Прежде всего, давайте создадим дубликат меры, которую мы уже создали.
Версия 2
На этот раз мы не будем полагаться на функции VALUES и FILTER, поэтому избавимся от них. Мы удалим возвращаемый результат, а также последнюю переменную, которую мы создали внутри CALCULATE. Затем мы преобразуем CALCULATE в CALCULATETABLE.
И вместо того, чтобы возвращать скалярное значение, на этот раз мы собираемся вернуть DatesInLast3Dates . Это вернет ту же CALCULATETABLE, которую мы сделали ранее. Мы собираемся использовать функцию РАСЧЕТ, и в первом аргументе мы собираемся вычислить меру дохода и внедрить РАСЧЕТНУЮ ТАБЛИЦУ в качестве контекста фильтра.
Как только я внесу его в матрицу, вы увидите, что мы возвращаем одно и то же общее значение для каждой ячейки.
Использование функции KEEPFILTERS
На данный момент мы знаем, что расчет за сценой работает правильно, но как мы можем знать наверняка, что для каждой ячейки мы сообщаем значение только для этого финансового уровня?
С помощью CALCULATETABLE мы создали таблицу, содержащую финансовый уровень, столбец даты и столбец дохода. Мы можем использовать ключевую функцию фильтра, чтобы создать пересечение между контекстом фильтра, существующим за пределами CALCULATETABLE, и контекстом, созданным CALCULATETABLE.
После того, как мы нажмем «Подтвердить», мы увидим, что мы сообщаем правильное значение для каждой ячейки и что и версия 1, и версия 2 возвращают правильное значение.
Так как же это работает? Таблица CALCULATE вернет уровень технического обслуживания , затем аренда , внешний сервис и запасные части . Функция создаст пересечение между обслуживанием и этой таблицей.
Аренда создаст начальный контекст фильтра, затем CALCULATETABLE вернет все значения категории «Работа». Тогда будет пересечение между Rental и таблицей, возвращаемой CALCULATETABLE. Мы собираемся вернуть таблицы или строки только для этой части проката.
И наконец, когда мы вводим SUMMARIZE в контекст фильтра, функция CALCULATE будет вычислять доход только от аренды. Тот же процесс происходит для каждой строки.
Версия 3
Давайте рассмотрим другой способ вычисления того же вычисления с использованием языка DAX LuckyTemplates. Давайте создадим копию показателя версии 2 и создадим еще один показатель. Мы собираемся назвать эту версию 3.
Идея этого расчета заключается в том, что, поскольку мы вычисляем доход с помощью функции РАСЧЕТ, нам не нужно использовать часть ДОБАВИТЬ КОЛОНЦЫ, потому что мы дублируем одно и то же внутри и вне функции РАСЧЕТ. Вместо этого мы можем просто написать, что Revenue не должен быть равен 0.
Как только я нажму «Подтвердить», нам нужно убедиться, что код работает, поэтому давайте перетащим меру внутрь матрицы.
Вы можете видеть, что код фактически возвращает одно и то же значение для каждой ячейки.
Если я попытаюсь изменить контекст фильтра, изменив дату в срезе даты и выбрав пару значений из имени клиента, вы увидите, что все три показателя фактически возвращают одно и то же значение для каждой строки.
Заключение
В этом руководстве мы узнали, как использовать сложную логику перемещения назад во времени от конечной даты, чтобы определить три самые важные даты. Основываясь на этом методе LuckyTemplates на языке DAX, мы смогли вычислить доход и показать только те значения, которые существуют в контексте фильтра. Это все на данный момент в этом уроке.
В этом руководстве показано, как в конечном итоге можно рассчитать разницу между еженедельными результатами продаж с помощью DAX в LuckyTemplates.
Что такое self в Python: примеры из реального мира
Вы узнаете, как сохранять и загружать объекты из файла .rds в R. В этом блоге также рассказывается, как импортировать объекты из R в LuckyTemplates.
В этом руководстве по языку программирования DAX вы узнаете, как использовать функцию GENERATE и как динамически изменять название меры.
В этом учебном пособии рассказывается, как использовать технику многопоточных динамических визуализаций для создания аналитических сведений из динамических визуализаций данных в ваших отчетах.
В этой статье я пройдусь по контексту фильтра. Контекст фильтра — одна из основных тем, с которой должен ознакомиться любой пользователь LuckyTemplates.
Я хочу показать, как онлайн-служба LuckyTemplates Apps может помочь в управлении различными отчетами и аналитическими данными, созданными из различных источников.
Узнайте, как рассчитать изменения вашей прибыли, используя такие методы, как разветвление показателей и объединение формул DAX в LuckyTemplates.
В этом руководстве будут обсуждаться идеи материализации кэшей данных и то, как они влияют на производительность DAX при предоставлении результатов.
Если вы все еще используете Excel до сих пор, то сейчас самое подходящее время, чтобы начать использовать LuckyTemplates для своих бизнес-отчетов.