[Мастер класс по 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

КОМЕНТАРІ • 12

  • @ДмитрийНикитин-и8о
    @ДмитрийНикитин-и8о 2 місяці тому

    Спасибо! Я похожую задачку недавно решал путём добавления в Power Query нехватающих строк с датами по товарам и заполнением их последней ценой вниз. Возьму на вооружение этот способ. Я чуть упростил формулу:
    Последняя цена :=
    VAR Last_Date =
    CALCULATE(
    MAX( 'ИзменениеЦенПоТоварам'[ДатаИзмененияЦены] ),
    'спрКалендарь'[Date]

  • @liliyastorogenko
    @liliyastorogenko 4 роки тому

    Спасибо. Здорово!

  • @makotkin
    @makotkin 2 роки тому

    Недавно попалась интересная задачка о ценах и прибыли.
    Где вместо таблицы изменения цены (дата, товар, цена) у нас есть:
    1. таблица закупок (дата, товар, КОЛВО, цена закупки).
    2. таблица продаж (дата, товар, колво, цена продажи).
    Как в этом случае рассчитать чистую прибыль от продаж за периоды (например понедельно).
    Ведь закупки разного объема. Сегодня купили 100шт по 10 рублей, а завтра 2000шт по 9 рублей. И продажи разного объема.
    Есть мысли как это решается?

  • @webdozor
    @webdozor 3 роки тому +1

    Не совсем понял, для чего существует связь между таблицами, в данном случае она просто заставляет всякий раз сбрасывать фильтры с даты.
    В любом случае, на моей взгляд, данную задачу можно решить одним CALCULATE.
    Последняя цена =
    VAR CURRENTDATE = MAX ( 'спрКалендарь'[Date] )
    RETURN
    IF ( HASONEFILTER ( 'ИзменениеЦенПоТоварам'[Товар] ),
    CALCULATE ( LASTNONBLANKVALUE ( 'ИзменениеЦенПоТоварам'[ДатаИзмененияЦены], SUM ( 'ИзменениеЦенПоТоварам'[Цена] ) ),
    ALL ( 'спрКалендарь'[Date] ),
    'ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]

    • @bi-powerbipivotdax7623
      @bi-powerbipivotdax7623  3 роки тому +1

      1) в DAX одну и ту же задачу можно решить многими способами. Моим, Вашим и другими
      2) Связь с календарем создана, так как в реальной ситуации в модели данных будет справочник календарь. И все расчеты должны идти через этот справочник. В DAX есть правило - не использовать те даты, которые находятся в таблицах. Для дат нужно создавать отдельные календари, иначе многие функции работы с датами в определенных ситуациях будут выдавать ошибки и неверные результаты.

    • @webdozor
      @webdozor 3 роки тому +1

      @@bi-powerbipivotdax7623 Я не пытался сказать, что мой вариант единственно верный. Просто был вопрос ниже о более заточенном способе. Из известных мне, LASTNONBLANKVALUE - наиболее подходит для этой задачи. Плюс, всегда есть вопрос производительности. На маленькой выборке это конечно не критично, но с увеличением объема данных и количества мер, каждая миллисекунда дорога. И если говорить чисто о производительности, то мой вариант тоже не самый - самый.

    • @ВладЛев-х7м
      @ВладЛев-х7м 6 місяців тому

      сортов того, как делать не нужно тоже много, мы ведь инженеры и должны стремится к совершенству @@bi-powerbipivotdax7623

    • @ВладЛев-х7м
      @ВладЛев-х7м 6 місяців тому

      @@webdozor Позволю себе критику))
      На больших данных ваш код может работать чуть медленно из-за функции LASTNONBLANKVALUE, так как эта функция будем высчитывать цену на каждую дату. Вместо это можно использовать функцию MAX или LASTADE которые вернут просто последнюю дату. Я подготовил пример:
      Последня цена =
      VAR _LastDate =
      CALCULATETABLE(
      LASTDATE('ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]),
      'спрКалендарь'[Date]

    • @webdozor
      @webdozor 6 місяців тому +2

      @@ВладЛев-х7м Я уже и забыл про этот пост. В любом случае, про производительность я писал в своем следующем комментарии. Идея была в том, что LASTNOTBLANKVBALUE существует как раз для решения подобных задач, и раз уж мы рассматривем этот вопрос, про нее неплохо было бы знать.
      Но если уж вы напираете нп производительность, без ущерба для красоты решение должно быть примерно такое:
      last_price =
      VAR PREVIOUS_PRICE_CHANGE_DATE = CALCULATE(
      MAX('ИзменениеЦенПоТоварам'[ДатаИзмененияЦены]),
      'спрКалендарь'[Date]

  • @zhiv_pro
    @zhiv_pro 5 років тому

    Добрый день! Возможно ли данные Мастер-классы увидеть в своем личном кабинете?

    • @bi-powerbipivotdax7623
      @bi-powerbipivotdax7623  5 років тому

      Здравствуйте, Игорь. Да, данные мастер-классы уже доступны в личном кабинете учеников курса "DAX - это просто". В папке самого курса, в подпапке "дополнительные материалы"