Динамический АВС-анализ в Power BI (часть 2)

แชร์
ฝัง
  • เผยแพร่เมื่อ 2 พ.ย. 2024

ความคิดเห็น • 72

  • @ConstellationBI
    @ConstellationBI  ปีที่แล้ว +7

    Многие писали, что мера АВС не захватывает товар с самой минимальной выручкой. Чтобы исключить это, нужно добавить в код DAX условие для расчета доли: выбирай минимум между долей и 1. Обновленный код см.ниже:
    ABC Выручка =
    // считаем выручку по товарам каждого класса АВС
    // формируем таблицу с уникальным перечнем товаров и значением выручки для каждого товара
    var SalesByProduct = ADDCOLUMNS(ALLSELECTED('Товары'), "@ProdSales",[Выручка])
    // считаем значение выручки по всем товарам
    var AllSales = CALCULATE([Выручка],ALLSELECTED('Товары'))
    var CumByProduct = ADDCOLUMNS(SalesByProduct,"@CumP",
    // определяем выручку для текущего товара
    var CurrentSalesA = [@ProdSales]
    // сортируем таблицу SalesByProduct по убыванию
    var CumulatedSales = FILTER(SalesByProduct, [@ProdSales]>=CurrentSalesA)
    // считаем выручку нарастающим итогом
    var CumulateSalesA = sumx(CumulatedSales,[@ProdSales])
    // считаем долю; выбор минимума для избежания >100% в случае округления
    return
    MIN(DIVIDE(CumulateSalesA, AllSales) ,1)
    )
    // на основании доли определяем класс АВС
    var ProductClass = filter(CROSSJOIN(CumByProduct,'АВС группы'),
    and([@CumP]>'АВС группы'[Нижняя граница],
    [@CumP]

    • @TxHJ5sez3mp
      @TxHJ5sez3mp 3 หลายเดือนก่อน

      а почему не попадает?

    • @ConstellationBI
      @ConstellationBI  3 หลายเดือนก่อน +1

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

  • @СаналМаштыков-ч5й
    @СаналМаштыков-ч5й ปีที่แล้ว +1

    Оооочень подробное и оооочень полезное видео, Анна! Огромное вам спасибо за труд!

  • @denistalko6585
    @denistalko6585 ปีที่แล้ว +1

    У вас замечательное объяснение! Спасибо вам огромное!

  • @kazyn-wms
    @kazyn-wms 2 ปีที่แล้ว +2

    Анна, спасибо вам большое за столь детальные видео и полезные, спасибо вы большая умница :)

  • @ЕленаМорозова-щ9ъ
    @ЕленаМорозова-щ9ъ 2 ปีที่แล้ว +1

    Спасибо огромное! Вы моя спасительница! ❤🌹🌹🌹

  • @Ольга-ц5н3м
    @Ольга-ц5н3м ปีที่แล้ว

    СПАСИБО ОГРОМНОЕ! Три дня мучалась с такой же задачей, и благодаря вам за 10 минут все получилось, жаль что не нашла вас раньше. Спасибо!

  • @АннаЧернышова-о5я
    @АннаЧернышова-о5я 2 ปีที่แล้ว +2

    Долгожданное видео))) Как всегда все просто и понятно. Спасибо, Анна, что делитесь знаниями!!! Все Ваши наработки очень полезные и интересные. Благодарю!!!

    • @ConstellationBI
      @ConstellationBI  2 ปีที่แล้ว

      Спасибо, @Анна Чернышова, за теплый отзыв!

  • @КристинаГорелко
    @КристинаГорелко 8 หลายเดือนก่อน +1

    у меня нет слов как это крутоооооооооо

  • @Radmit-k6r
    @Radmit-k6r 7 หลายเดือนก่อน +1

    Чудо🎉🎉🎉

  • @misyukandrey
    @misyukandrey 2 ปีที่แล้ว

    Супер! Спасибо большое. Я сам так и не смог побороть динамический АВС ))

  • @zubrdens
    @zubrdens 5 หลายเดือนก่อน +1

    Как, интересно, решить вот такую задачу: нужно для продуктов, сгруппированных по abc, суммировать прибыль, затраты на логистику и т.д?

    • @ConstellationBI
      @ConstellationBI  5 หลายเดือนก่อน

      Нужно построить вспомогательную таблицу с перечнем классов А, В, С (таймкод 11:21). Далее надо решить на основе какого показателя будет разделение товаров на классы А, В, С. Допустим, как в видео, на основе выручки. Тогда нужна мера как в видео (таймкод 13:35). Далее, чтобы посчитать прибыль товаров каждого класса, нужно создать похожую меру, внутри которой также распределить классы на основе какого-то показателя, скажем выручки, а в строке 13 кода меры использовать уже не меру выручки, а прибыль

  • @ЮлияН-ъ3и
    @ЮлияН-ъ3и 2 ปีที่แล้ว

    Благодарю! За такое подробное видео, очень познавательно 👍

  • @ВладимирСеменов-ы7щ9ф
    @ВладимирСеменов-ы7щ9ф ปีที่แล้ว +1

    Анна, огромное спасибо! Только на последнем шаге у меня DAX стал ругаться на функцию SWITCH. Вышел из положения, заменив ее двойным IF: IF (IF)

  • @солнышкосолнышко-г8ъ
    @солнышкосолнышко-г8ъ ปีที่แล้ว

    спасибо большое!!

  • @FrauLIV
    @FrauLIV 9 หลายเดือนก่อน

    Спасибо за видео! Поделитесь, пожалуйста, знаниями: как рассчитать скользящую сумму продаж за последние 5 недель за каждую из пяти недель, если период суммирования определяется от последней даты на конец недели минус кол-во дней за 5 недель. Буду строить сводную, где будет выведена мера, рассчитывающая скользящие продажи за месяц на каждую неделю

    • @ConstellationBI
      @ConstellationBI  9 หลายเดือนก่อน

      Для скользящей средней я бы использовала функцию WINDOW, в которую нужно передать такую же таблицу, какая будет в виджете, где вы хотите меру скользящего среднего использовать. Про построение скользящего среднего с помощью WINDOW я рассказывала в 3-м Уроке, th-cam.com/video/gmjszpN9dW0/w-d-xo.html, таймкод 01:04:36. И еще оконные функции разбирала здесь: th-cam.com/video/hHUXWnBKPzs/w-d-xo.html. Если возникнут трудности, пришлите файл на мою почту anna.powerbi@yandex.ru

  • @ВячеславМихайлов-и8т
    @ВячеславМихайлов-и8т ปีที่แล้ว

    Очень нужен детальный разбор AllSelect,expect и т.д. все ещё нет понимания как они работают в таблице, визуализациях, мерах... Порой получаешь не то что ожидаешь.
    Заранее благодарен!

  • @imunely
    @imunely ปีที่แล้ว

    Коллеги, подскажите, пожалуйста, почему нельзя в первой формуле с if заменить 4 строчку: var CurrentSalesA = [Выручка] на var CurrentSalesA = [@ProdSales] (ссылку приложить не удалось, ошибка: The value for '@ProdSales' cannot be determined. Either the column doesn't exist, or there is no current row for this column.) и, наоборот, почему во второй формуле 5ую строчку var CurrentSalesA = [@ProdSales] нельзя заменить на var CurrentSalesA = [Выручка], так как поменяется значение (ошибки не будет). Мы же записываем просто значение, какая разница откуда оно. Контент 💣

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      @Irina S, 4-ая строчка: В переменной CurrentSalesA = [Выручка] определяется выручка текущего товара. "Текущий" определяется контектом виджета. Например, для определения класса для Апельсины CurrentSalesA = выручка по апельсинам и т.д. по аналогии
      5-ая строчка: В переменной CumSales = filter(SalesByProduct, [@ProdSales] >= CurrentSalesA) фильтруется таблица SalesByProduct по условию, что значения выручки из столбца [@ProdSales] больше или равно выручки текущего товара.
      Т.о. нельзя заменить [@ProdSales] и CurrentSalesA, т.к. CurrentSalesA это значение, а [@ProdSales] это весь столбец.

  • @giorgitsotsonava2979
    @giorgitsotsonava2979 ปีที่แล้ว

    Анна, такой вопрос, если у меня уже в главное таблице продаж напротив каждой номенклатуры указаны категории, нужно ли мне тогда использовать функции которые у вас на второй и 3-й строках? Спасибо.

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      Не очень поняла вопрос. Если нужно рассчитать авс для категорий, то нужно написать соответствующую меру авс для категорий

  • @giorgitsotsonava2979
    @giorgitsotsonava2979 9 หลายเดือนก่อน

    Я правильно понял, что главная мера, которую вы записали работает в том случае если таблица продаж состоит только из номенклатур и даты продаж? А если к примеру у меня таблица прожад выглядит из следующих столбцоа: Product_name, Order_id, Order_date, Sales? Тоесть продажи на уровне продукта и номера заказа. В данном случае мера будет работать корректно?

    • @ConstellationBI
      @ConstellationBI  9 หลายเดือนก่อน

      Мера должна работать корректно не зависимо от того, сколько столбцов в таблице продаж. Если нет, то пришлите мне свой файл pbix на почту anna.powerbi@yandex.ru

    • @giorgitsotsonava2979
      @giorgitsotsonava2979 9 หลายเดือนก่อน

      @@ConstellationBI Спасибо. Меру записал заново. Она заработала и работает корректно.

  • @visense2830
    @visense2830 11 หลายเดือนก่อน

    Подскажите как быть, если в таблице в которую выводим АВС анализ, не только товар (яблоки, груши и т.д.), но еще и например цвет этого товара)). Проблеиа в том, что когда добавляем еще одно значение, то АВС анализ перестает работать. Спасибо

    • @ConstellationBI
      @ConstellationBI  11 หลายเดือนก่อน

      Показанный расчет АВС работает по уникальному списку товаров. Если вы строите его к списку "яблоки, груши", а потом добавляете цвет, который дробит ваш список товаров на "яблоки зеленые, яблоки красные", то получается, что АВС вы считали не по уникальному списку. Я бы посоветовала сформировать уникальный список товаров в том виде, в каком будете его строить в виджете, и к нему считать АВС

  • @Vlimbo
    @Vlimbo 2 ปีที่แล้ว

    Подскажите, пожалуйста, как для каждого уровня номенклатуры реализовать расчет ABC? У меня иерархия такая: категория - подкатегоря - подкатегория2 - модель. А результат выводится в виде таблицы, где в строках разворачивается эта иерархия (на + нажимает пользователь и разворачивает уровни при необходимости). Нужно чтобы в каждом уровне АBC считался. Для категории - по всем категориям, по подкатегории - среди подкатегорий развернутой категории, и так далее.

    • @АльфияТюмкова
      @АльфияТюмкова 2 ปีที่แล้ว

      Добрый день! Вам удалось реализовать АВС с категориями и подкатегориями?

    • @ConstellationBI
      @ConstellationBI  2 ปีที่แล้ว +1

      @Владислав Цалковский , для каждого уровня иерархии нужно назначить свой расчет АВС. Для нижнего уровня иерархии вы считаете АВС как я показала на видео, для среднего уровня (подкатегория) - как уже ответил Антон Курносов (спасибо, Антон!). Далее строите свою таблицу, где в строках разворачивается иерархия. Эта иерархия - наш контекст, а DAX как раз и работает внутри контекста. Т.е. нам нужно объяснить DAX что для разного контекста нужно использовать разные расчеты АВС-анализа. Для этого я бы сделала проверку через функцию ISFILTERED:
      Контекст =
      SWITCH(TRUE(),
      ISFILTERED('Таблица'[Товар]),1, //если фильтруется по товару, то значение 1
      ISFILTERED('Таблица'[Подгруппа]),2, //если фильтруется по подгруппе, то значение 2
      ISFILTERED('Таблица'[Группа]),3 //если фильтруется по группе, то значение 3
      )
      А далее через if можно уже рассчитать АВС: если [Контекст]=1, то считай АВС для товаров, если [Контекст]=2, то считай АВС для подгруппы и т.п.

    • @ConstellationBI
      @ConstellationBI  2 ปีที่แล้ว

      @@АльфияТюмкова ответила

  • @ninojiqia4066
    @ninojiqia4066 ปีที่แล้ว

    Спасибо за такую ​​хорошую работу, если вы можете сказать мне, как посчитать, сколько наименование продуктов , например, в категории А?
    заранее спасибо

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว +1

      На минуте 13:35 показываю как рассчитать выручку каждого класса. В мере указываю другую меру - [Выручка]. Вам нужно написать меру, которая считает товары, например distinctcount, и в меру АВС класса уже вставлять не выручку, а меру числа товаров

    • @ninojiqia4066
      @ninojiqia4066 ปีที่แล้ว

      @@ConstellationBI
      Когда я меняю на меру distinct count , он считает общее количество товаров и не обращает внимания на фильтр.

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      Какой фильтр? Вам нужно встроить меру distinctcount в расчет АВС

    • @ninojiqia4066
      @ninojiqia4066 ปีที่แล้ว

      @@ConstellationBI
      Я оставляю все так же, как показано в вашем видео, но вместо общей суммы меня интересует, сколько товаров попадает в категории А, В и С.

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว +1

      Вам нужно создать отдельную меру КолвоТоваров. Дальше взять код меры АВС выручка, на минуте 13:35, и в нем в двух местах, в строках 2 и 3, указания меры [Выручка] заменить на указание меры [КолвоТоваров]

  • @MaybachONE
    @MaybachONE 2 ปีที่แล้ว

    А как посчитать кол-во товаров в каждой группе ABC по второй мере? 🙂Не получается дописать её. Точнее не могу получит нужный результат.
    Попробовал вот так в Result - CALCULATE ( COUNTX(CumByProduct, [Прибыль]), KEEPFILTERS ( RoductClass ) , но это не дало нужного результата - в каждой группе одинаковое число товаров. Как написать меру количество товаров каждого класса?

    • @MaybachONE
      @MaybachONE 2 ปีที่แล้ว +2

      Разобрался, походу 🙉CALCULATE ( COUNTX("Товары", [Прибыль]), KEEPFILTERS ( PoductClass ) )

    • @ConstellationBI
      @ConstellationBI  2 ปีที่แล้ว +1

      @@MaybachONE отлично! Извините за долгий ответ)) Зато всегда приятнее разобраться самому!))
      Кстати, вместо COUNTX('Товары', [Прибыль]) можно использовать COUNTROWS('Товары')

  • @ІринаКінебас
    @ІринаКінебас ปีที่แล้ว

    Подскажите, что делать, если не проставляется категория АВС на некоторых наименованиях, а на остальных проставляется?

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      Попробуйте код меры-DAX из закрепленного комментария к видео. Там добавила проверку чтобы при расчете меры не получилось >100%. Или пришлите мне файл на почту, я посмотрю

    • @ІринаКінебас
      @ІринаКінебас ปีที่แล้ว

      Спасибо большое за ответ😊 к сожалению файл не смогу скинуть, он с рабочими данными
      Буду пробовать на основе закреплённого комментария что-то менять
      Спасибо!

  • @MaybachONE
    @MaybachONE 2 ปีที่แล้ว

    Спасибо за классный гайд! 😀 Единственное, не могу понять - почему у меня если использовать меру только на товары, то ABC проставляется корректно, а если я хочу эту меру применить к товарной группе, то ABC проставляется некорректно? Хотя в самой мере я изменил HASONEVALUE ( 'Товары'[Товары] ), на HASONEVALUE ( 'Товары'[Товарная группа] ). С чем это может быть связано?

    • @MaybachONE
      @MaybachONE 2 ปีที่แล้ว +2

      Разобрался😄 Надо было прописать HASONEVALUE ( 'Товары'[Товарная группа] ) и в ALLSELECTED ( 'Товары'[Товарная группа] ).

    • @Vlimbo
      @Vlimbo 2 ปีที่แล้ว

      @@MaybachONE для каждого уровня номенклатуры отдельную меру в итоге писали? У меня иерархия такая: категория - подкатегоря - подкатегория2 - модель. А результат выводится в виде таблицы, где в строках разворачивается эта иерархия (на + нажимает пользователь и разворачивает уровни при необходимости). Нужно чтобы в каждом уровне АBC считался.

    • @MaybachONE
      @MaybachONE 2 ปีที่แล้ว

      @@Vlimbo а у меня нет иерархии. У меня 2 отдельные таблицы. Поэтому, не подскажу. Но по всей видимости - да, надо для каждого уровня иерархии писать меру отдельную.

    • @Vlimbo
      @Vlimbo 2 ปีที่แล้ว

      @@MaybachONE понял, надеюсь Анна прочитает

    • @MaybachONE
      @MaybachONE 2 ปีที่แล้ว

      ​@@Vlimbo а тут можно попробовать сделать следующую связку. Рассчитать три меры для каждого уровня, или в VAR их записать.
      И потом:
      IF(
      ISINSCOPE (Товары[name]),
      мера для товаров,
      IF(
      ISINSCOPE (Товары[Subcategory]),
      мера для подкатегорий,
      IF(
      ISINSCOPE (Товары[Category]),
      мера для категорий
      )
      )
      )
      Как-то так. Но сам не пробовал. 🙈

  • @ВиталийФрик
    @ВиталийФрик ปีที่แล้ว

    Анна, не включает минимальное значение в группу С. С чем может быть связано?

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      Можете прислать файл на почту?

  • @ЛенаЕгорова-я2л
    @ЛенаЕгорова-я2л ปีที่แล้ว

    добрый день! никак не могу разобраться, какие изменения внести в код, чтобы решить проблему:
    создаю таблицу с товарами, на них влияют фильтры территории и менеджера и АВС анализ в данном случае работает как нужно.
    но при выборе, помимо фильтров территории и менеджера, - одного товара - ранг "АВС" пересчитывается. мне же нужно, чтобы ранг АВС остался таким, какой он есть, если не выбирать конкретный товар.
    код полностью идентичен коду в видео, как можно решить проблему?

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      Добрый день! Вам нужно настроить контекст фильтра по товарам. Попробуйте функцию ALLSELECTED заменить на ALL. Подробнее по функциям ALLxxx смотрите в моем уроке th-cam.com/video/xL0T9LZ9Jww/w-d-xo.html

    • @ЛенаЕгорова-я2л
      @ЛенаЕгорова-я2л ปีที่แล้ว

      @@ConstellationBI получается, мне нужно, чтобы нарастающий итог не реагировал на фильтр товара. то есть изменения требует строчка кода: var CumSalesA = SUMX(CumSales, [@ProdSales]) ?

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      Вы попробовали заменить ALLSELECTED на ALL ? Не помогло?

    • @ЛенаЕгорова-я2л
      @ЛенаЕгорова-я2л ปีที่แล้ว

      @@ConstellationBI изменения произошли, но результат все равно не тот, что нужно. например, нужный мне товар при полном списке товаров попадает в категорию В. Если не менять код и просто выбрать именно этот товар, то товар попадает в категорию С. Если заменить ALLSELECTED на ALL, то товар (при фильтрации) попадает в группу А.
      АВС класс_3 = IF(HASONEVALUE('TC'[SKU_final]),
      var SalesByProdact = ADDCOLUMNS(ALLSELECTED('TC'), "@ProdSales", [Volume_23])
      var AllSales = CALCULATE([Volume_23], ALL('TC'))
      var CurrentSalesA = [Volume_23]
      var CumSales = FILTER(SalesByProdact, [@ProdSales]>=CurrentSalesA)
      var CumSalesA = SUMX(CumSales, [@ProdSales])
      var CurrentCumP = DIVIDE(CumSalesA, AllSales)
      var result = SWITCH(TRUE(),
      ISBLANK([Volume_23]), BLANK(),
      CurrentCumP

    • @ConstellationBI
      @ConstellationBI  ปีที่แล้ว

      @@ЛенаЕгорова-я2л пришлите файл на почту, посмотрю

  • @Bi-dj3iy
    @Bi-dj3iy 5 หลายเดือนก่อน

    Сделал меру динамический ABC, но ни как его в срез не засуну.

    • @ConstellationBI
      @ConstellationBI  5 หลายเดือนก่อน

      Меру не получится использовать в срезе. Т.к. мера требует какого-то контекста. В срез можно поместить только столбцы физической таблицы.

    • @Bi-dj3iy
      @Bi-dj3iy 5 หลายเดือนก่อน

      @@ConstellationBI да, спасибо. Сделал таблицу c ABC, пытался её с формулой связать, получилось только что могу сделать пусто вместо A,B,С видимо надо что бы товар выводился через меру, но так и не стал замораживаться.

  • @MaybachONE
    @MaybachONE 2 ปีที่แล้ว +1

    ​ @Созвездие Power BI Еще есть одна задача, с которой не могу справиться🙈. У меня получается две таблицы - ABC группы товаров и ABC товары. Когда я накладываю фильтр по группе товаров, то все отлично, по товарам в данной группе проставляется ABC. Но когда я фильтрую страницу по конкретному товару, то в таблице ABC группы товаров проставляет категорию не корректно - он учитывает только один этот товар в данной категории. Получается. что в место А, становится С. (надеюсь, понятно объясняю.)
    А я хочу, чтобы когда я выбирал конкретный товар, чтобы в таблице ABC группы товаров сохранялся присвоенный класс ABC каждой группе. Типа: фрукты продаются лучше чем овощи, у них категория А. И если мы выбираем где-то товар банан, то категория остается как есть А, а не меняется.
    Я перепробовал разные варианты со снятием фильтров, но так и не подобрал нужную мне комбинацию. Как я понимаю, надо тут снимать фильтр. - drive.google.com/file/d/1WqcAbgdld5z3NTNXUm6aIYGU4qE4eut6/view?usp=sharing
    Подскажите, как быть?)

    • @ConstellationBI
      @ConstellationBI  2 ปีที่แล้ว

      @Антон Курносов, напрашивается вариант отменить воздействие виджета-таблицы АВС товаров на виджет-таблицу АВС группы. Кликаете на виджет -> вверху вкладка Формат -> изменить взаимодействие

    • @MaybachONE
      @MaybachONE 2 ปีที่แล้ว

      @@ConstellationBI да, я думал об этом варианте) Но хотел справится мерой) Чтобы при выборе товара, в таблице группы товаров показывало определенную группу, в которой товар, но ABC считался как если бы отображались все группы товаров)

    • @ConstellationBI
      @ConstellationBI  2 ปีที่แล้ว +1

      @@MaybachONE по вашему принтскрину попробуйте снять фильтр и в переменной AllSales, и в переменной SalesByProduct