Страницы: 1
RSS
DAX: отбор клиентов, которые сработали последний раз 3 месяца назад и более
 
Здравствуйте, уважаемые! Не могу правильно написать меру, которая бы решила следующую задачу: необходимо из общего списка продаж помесячно выделять и считать только тех клиентов, которые последний раз отгружались 3 месяца назад и более. Например. В марте всего отгрузились 9 клиентов, но только 4 из них нужно посчитать, т.к. до марта их последние заказы были в ноябре 2019 или ранее. Во вложении пример как есть и как должно быть.
П.С. в таблице есть дополнительное поле "торговая точка" - мера не должна реагировать на это поле. Мой неправильный вариант меры, который я сделал, корректно работает только с последним месяцем, и к сожалению, реагирует, на поле "торговая точка".
 
здравствуйте, вроде получилось

извините, сразу не заметил: некорректно итог для года считается. теперь сижу туплю
Изменено: genosser - 25.03.2020 16:17:31
 
Цитата
genosser написал:
теперь сижу туплю
Это через SUMMARIZE не очень сложно решается, но у вас нет проверки на наличие продаж до предыдущих трех месяцев, таким образом в список возращенцев могут попасть новые клиенты. А вообще решение отличное, я не допер, хотя башку поломал знатно, хотел пойти другим путем и встрял. А ваш вариант слегка допилить и будет конфетка.
Изменено: PooHkrd - 25.03.2020 16:26:22
Вот горшок пустой, он предмет простой...
 
PooHkrd, подскажете, как допилить?
 
genosser, покопаюсь еще вечерком. Работы много. Подозреваю, что Владимир сам допилит быстрее меня, основное направление вы показали.
Вот горшок пустой, он предмет простой...
 
genosser, большое спасибо Вам за решение! Завтра попробую подробно разобраться в Вашем подходе и потом отпишусь.
 
В общем допилил, получился вот такой монстрик:
Код
Допилено:=SUMX( 
   FILTER(
      ADDCOLUMNS(
         CROSSJOIN(
            VALUES('Calendar'[порядк № месяца]);
            VALUES('продажи'[клиент_код]));
         "temp";
         CALCULATE( IF( ISBLANK(
            CALCULATE( 
               SUM('продажи'[сумма заказа]);
               DATESBETWEEN(Calendar[Date];
                  FIRSTDATE(PARALLELPERIOD(Calendar[Date];-3;month));
                  STARTOFMONTH(Calendar[Date]) );
                  ALLSELECTED('продажи'[торговая точка]) ) ) ; SUM('продажи'[сумма заказа]); BLANK() ) ) );
      [temp]<>BLANK() );
   [temp])

Правда сделал не на SUMMARIZE, а на ADDCOLUMNS + CROSSJOIN так заметно быстрее шуршит. А вообще на эту тему у итальянцев есть огромная статья И там есть файл-пример для скачивания. Собственно из этого файла вам нужна мера Sales Recovered Customers.
Изменено: PooHkrd - 25.03.2020 20:14:32
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо.
А почему одной мерой? Производительность же не будет отличаться, если монстрика на запчасти разобрать?
 
genosser, ну вот так собрал. Если нужно - разберите. У нас страна свободная, никто не запрещает!  :D Производительность? Нет, не должна страдать.
Изменено: PooHkrd - 25.03.2020 21:28:44
Вот горшок пустой, он предмет простой...
 
PooHkrd,просто спросил, есть ли разница... Забрал в копилку
 
genosser, PooHkrd, - огромное Вам спасибо за помощь! Смотрю итоговое решение, читаю его и понимаю как это работает, НО сам бы до такого не додумался! Не дорос я еще до этого уровня. В процессе адаптации к реальным данным вылезла новая проблема (так всегда бывает - очень трудно заранее предусмотреть все нюансы): в список попадают новые клиенты, которые отгрузились первично в этом месяце. В примере я воспроизвел такой случай (смотрите " клиент 3")
Меру подкорректировал, добавив еще одну проверку. Получился вот такой итоговый монстр:
П.С. мне монстры тоже нравятся (они наглядны, если правильно отступы делать и их можно оперативно править):
Код
=SUMX( 
   FILTER(
      ADDCOLUMNS(
      //делаем всевозможные комбинации из пары элементов "клиент" и "номер месяца", по которым будем фильтровать вирт. таблицу
         CROSSJOIN(
            VALUES('Calendar'[порядк № месяца]);
            VALUES('продажи'[клиент_код]));
         "temp";
         CALCULATE(
         //будем считать только тех клиентов, которые отвечают двум условиям:
             IF(AND(
                //первое условие: проверка клиентов, кто покупал за последние три месяца. НО!! ISBLANK() 
                //позволяет соответственно вернуть тех, кто не брал за этот период - что нам и нужно!
                ISBLANK(
                     CALCULATE(SUM('продажи'[сумма заказа]);
                           DATESBETWEEN(Calendar[Date];
                           FIRSTDATE(PARALLELPERIOD(Calendar[Date];-3;month));
                           STARTOFMONTH(Calendar[Date]) );
                           ALLSELECTED('продажи'[торговая точка])));
                    //второе условие: нужно исключить новых клиентов с первой отгрузкой в этом месяце, потому что они ИСТИННЫ в первом условии,
                    //а это нам не нужно
                     CALCULATE(MIN('продажи'[порядк № месяца]);
                        ALL('Calendar'))<>MAX('Calendar'[порядк № месяца]));
                  SUM('продажи'[сумма заказа]); BLANK())));
      [temp]<>BLANK());
   [temp])
 
Цитата
Vladimir Chebykin написал:
в список попадают новые клиенты
Это мой косяк, я вот товарищу genosser на это указал, а сам в итоговой мере это забыл подправить. Хорошо что вы из тех ТС кто сами с усами.  ;) Но все таки настоятельно рекомендую не упираться в данный вариант, а ознакомиться с творчеством итальянских профессионалов. Подозреваю что их мера может работать более быстро, хотя с виду она более навороченная.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх