[Мастер класс по DAX] Вывод в Power BI (P Pivot) последней измененной цены товара на выбранную дату
Вставка
- Опубліковано 25 вер 2024
- 1) [Скачивайте PDF] Справочник DAX функций для Power BI и Power Pivot на русском языке: biprosto.ru/ku...
2) [Скачивайте] Файлы к уроку для Power BI и Power Pivot: biprosto.ru/lp...
Наш главный сайт "BI - это просто": biprosto.ru
В данном мастер-классе мы на практике рассмотрим конкретную насущную проблему для пользователей DAX: как вывести в отчет Power BI (Power Pivot) последнюю измененную цену товара на выбранную дату?
В формулах мастер-класса используются следующие DAX функции: SUM, CALCULATE, CALCULATETABLE, FILTER, ALL, MAX, SELECTCOLUMNS, а также переменные DAX (VAR и RETURN))
Переходите, смотрите, изучайте подробный пошаговый видео-разбор формул DAX
----------------------------
Описание задачи
Имеется таблица с перечнем товаров. По каждому товару указана дата изменения цены и сама измененная цена.
Проблема заключается в следующем. Когда мы в отчете выберем, например, 23 апреля, то данная таблица с изменением цены также будет фильтроваться этим фильтром «23 апреля». Но в нашей таблице отсутствует строка с изменением цены 23 апреля! Соответственно, в отчете мы увидим «Пусто». Но это не означает, что у «Товара 1» 23 апреля цена равна нулю. Ведь 20 апреля цена изменилась и стала равняться 150 и, по сути, 23 апреля она тоже равняется 150. И лишь 25 апреля она изменилась и стала равняться 130.
Вот решением данной проблемы мы и займемся на практике на данном мастер-классе.
#powerbi #power_bi #DAX #язык_DAX #Power_Pivot #функции_DAX #формулы_DAX
Спасибо! Я похожую задачку недавно решал путём добавления в Power Query нехватающих строк с датами по товарам и заполнением их последней ценой вниз. Возьму на вооружение этот способ. Я чуть упростил формулу:
Последняя цена :=
VAR Last_Date =
CALCULATE(
MAX( 'ИзменениеЦенПоТоварам'[ДатаИзмененияЦены] ),
'спрКалендарь'[Date]
Спасибо. Здорово!
Недавно попалась интересная задачка о ценах и прибыли.
Где вместо таблицы изменения цены (дата, товар, цена) у нас есть:
1. таблица закупок (дата, товар, КОЛВО, цена закупки).
2. таблица продаж (дата, товар, колво, цена продажи).
Как в этом случае рассчитать чистую прибыль от продаж за периоды (например понедельно).
Ведь закупки разного объема. Сегодня купили 100шт по 10 рублей, а завтра 2000шт по 9 рублей. И продажи разного объема.
Есть мысли как это решается?
Не совсем понял, для чего существует связь между таблицами, в данном случае она просто заставляет всякий раз сбрасывать фильтры с даты.
В любом случае, на моей взгляд, данную задачу можно решить одним CALCULATE.
Последняя цена =
VAR CURRENTDATE = MAX ( 'спрКалендарь'[Date] )
RETURN
IF ( HASONEFILTER ( 'ИзменениеЦенПоТоварам'[Товар] ),
CALCULATE ( LASTNONBLANKVALUE ( 'ИзменениеЦенПоТоварам'[ДатаИзмененияЦены], SUM ( 'ИзменениеЦенПоТоварам'[Цена] ) ),
ALL ( 'спрКалендарь'[Date] ),
'ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]
1) в DAX одну и ту же задачу можно решить многими способами. Моим, Вашим и другими
2) Связь с календарем создана, так как в реальной ситуации в модели данных будет справочник календарь. И все расчеты должны идти через этот справочник. В DAX есть правило - не использовать те даты, которые находятся в таблицах. Для дат нужно создавать отдельные календари, иначе многие функции работы с датами в определенных ситуациях будут выдавать ошибки и неверные результаты.
@@bi-powerbipivotdax7623 Я не пытался сказать, что мой вариант единственно верный. Просто был вопрос ниже о более заточенном способе. Из известных мне, LASTNONBLANKVALUE - наиболее подходит для этой задачи. Плюс, всегда есть вопрос производительности. На маленькой выборке это конечно не критично, но с увеличением объема данных и количества мер, каждая миллисекунда дорога. И если говорить чисто о производительности, то мой вариант тоже не самый - самый.
сортов того, как делать не нужно тоже много, мы ведь инженеры и должны стремится к совершенству @@bi-powerbipivotdax7623
@@webdozor Позволю себе критику))
На больших данных ваш код может работать чуть медленно из-за функции LASTNONBLANKVALUE, так как эта функция будем высчитывать цену на каждую дату. Вместо это можно использовать функцию MAX или LASTADE которые вернут просто последнюю дату. Я подготовил пример:
Последня цена =
VAR _LastDate =
CALCULATETABLE(
LASTDATE('ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]),
'спрКалендарь'[Date]
@@ВладЛев-х7м Я уже и забыл про этот пост. В любом случае, про производительность я писал в своем следующем комментарии. Идея была в том, что LASTNOTBLANKVBALUE существует как раз для решения подобных задач, и раз уж мы рассматривем этот вопрос, про нее неплохо было бы знать.
Но если уж вы напираете нп производительность, без ущерба для красоты решение должно быть примерно такое:
last_price =
VAR PREVIOUS_PRICE_CHANGE_DATE = CALCULATE(
MAX('ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]),
'спрКалендарь'[Date]
Добрый день! Возможно ли данные Мастер-классы увидеть в своем личном кабинете?
Здравствуйте, Игорь. Да, данные мастер-классы уже доступны в личном кабинете учеников курса "DAX - это просто". В папке самого курса, в подпапке "дополнительные материалы"