Спасибо! Я похожую задачку недавно решал путём добавления в 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 - наиболее подходит для этой задачи. Плюс, всегда есть вопрос производительности. На маленькой выборке это конечно не критично, но с увеличением объема данных и количества мер, каждая миллисекунда дорога. И если говорить чисто о производительности, то мой вариант тоже не самый - самый.
@@webdozor Позволю себе критику)) На больших данных ваш код может работать чуть медленно из-за функции LASTNONBLANKVALUE, так как эта функция будем высчитывать цену на каждую дату. Вместо это можно использовать функцию MAX или LASTADE которые вернут просто последнюю дату. Я подготовил пример: Последня цена = VAR _LastDate = CALCULATETABLE( LASTDATE('ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]), 'спрКалендарь'[Date]
@@ВладЛев-х7м Я уже и забыл про этот пост. В любом случае, про производительность я писал в своем следующем комментарии. Идея была в том, что LASTNOTBLANKVBALUE существует как раз для решения подобных задач, и раз уж мы рассматривем этот вопрос, про нее неплохо было бы знать. Но если уж вы напираете нп производительность, без ущерба для красоты решение должно быть примерно такое: last_price = VAR PREVIOUS_PRICE_CHANGE_DATE = CALCULATE( MAX('ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]), 'спрКалендарь'[Date]
Здравствуйте, Игорь. Да, данные мастер-классы уже доступны в личном кабинете учеников курса "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 - это просто". В папке самого курса, в подпапке "дополнительные материалы"