Страницы: 1
RSS
DAX: мера вывода данных лучшего по прибыльности месяца
 
Всем привет!

Прошу помочь написать меру, которая будет выводить данные по магазину только за тот месяц, в котором прибыль магазина была наибольшей
Проблема выглядит так:

То есть, в данном примере для Магазин1 лучший по прибыли месяц - это 03 М (пусть, март). Так как доход 250, расход 130 --> прибыль 120 - максимальная из трех (100 в январе, 90 в феврале, 120 в марте)

Идея у меня была такая - сначала вычислить номер месяца, а затем вывести данные только по этому месяцу
Проблема возникла с получением лучшего месяца (лучшего по прибыли)

Логика такая:
1) делаем SUMMARIZE- виртуальную таблицу, в которой будет месяц-магазин-прибыль
2) смотрим макс значение
3) с помощью FILTER оставляем в табличке только макс значение (и, соответственно, месяц этого макс значения тоже останется)
4) с помощью функции VALUES берем название месяца

И вот проблема! VALUES пишет ошибку, когда пытаюсь получить данные из виртуальной таблички (MyTable1 или MyTable2). Как будто VALUES может в качестве аргумента принимать только исходную таблицу в модели данных, а не какие-либо еще таблицы(((

Что делать? Помогите пожалуйста!
Код
=
VAR MyTable1 =   
 SUMMARIZE (      
  Data;   
  [Магазин];      
  [Месяц];      
  "Прибыль в месяц"; SUMX(Data;[Сумма])      
 )

Var MyMax = 
 MAXX(MyTable1;[Прибыль в месяц])

Var MyTable2 =   
 FILTER (      
  MyTable1;      
  [Прибыль в месяц]=MyMax      
 )

RETURN VALUES(MyTable2[Месяц])

 
Цитата
PowerBI_WannaBe написал:
выводить данные по магазину только за тот месяц, в котором прибыль магазина была наибольшей
...
с помощью функции VALUES берем название месяца
Так данные или название месяца? :)
 
В итоге нужны именно данные! Просто логика была такая - сначала получить название месяца, а по названию месяца получить данные. Если есть другой  способ, помогите, пожалуйста))

То есть, в целом для вывода данных идея была такая:
 
Код
SUMX(CALCULATETABLE('Data';FILTER(ADDCOLUMNS(SUMMARIZE (
      Data;
      [Магазин];
      [Месяц];Data[Тип]);"Прибыль в месяц";CALCULATE(SUM(Data[Сумма]);ALL(Data[Тип]));"макс прибыль";CALCULATE(MAXX(SUMMARIZE (
      Data;
      [Магазин];Data[Месяц]);CALCULATE(SUM(Data[Сумма])));ALLEXCEPT(Data;Data[Магазин])));[макс прибыль]=[Прибыль в месяц]));'Data'[Сумма])
 
PowerBI_WannaBe, под Вашу идею:
1. Добавил в данные числовой столбец ГГГГММ: продажи не по 1 году будут и последний месяц при равных прибыли и продажах определить легче.
2. Вычисляются месяцы с максимальной прибылью, из них выбираются месяцы с максимальным доходом (да, их может быть несколько :) ), из последних выбирается последний месяц. Конечно, можно обойтись и без второго шага - найти последний месяц с максимальной прибылью.
3. Сложность придает то, что доход и расход в одном столбце. Были бы в разных, все было бы гораздо проще :)
Код
Лучший месяц :=
VAR tbl =
    ADDCOLUMNS (
        CALCULATETABLE ( VALUES ( 'Data'[ГодМесяц] ); ALL ( Data[Тип] ) );
        "@profit"; CALCULATE ( CALCULATE ( SUM ( [Сумма] ); ALL ( 'Data'[Тип] ) ) );
        "@income"; CALCULATE ( CALCULATE ( SUM ( [Сумма] ); 'Data'[Тип] = "Доход" ) )
    )
VAR tableWithMaxProfit =
    FILTER ( tbl; [@profit] = MAXX ( tbl; [@profit] ) )
VAR tableWithMaxProfitAndMaxIncomes =
    FILTER (
        tableWithMaxProfit;
        [@income] = MAXX ( tableWithMaxProfit; [@income] )
    )
VAR lastMonth =
    MAXX ( tableWithMaxProfitAndMaxIncomes; 'Data'[ГодМесяц] )
VAR result =
    CALCULATE ( SUM ( [Сумма] ); FILTER ( 'Data'; 'Data'[ГодМесяц] = lastMonth ) )
RETURN
    result
Изменено: surkenny - 24.12.2021 15:01:10
 
mechanix 85, если будет несколько месяцев с одинаковой прибылью, Ваша мера покажет сумму продаж всех этих месяцев.
Так же для разных магазинов лучший месяц может быть разным. Ваша мера при выборе нескольких магазинов даст сумму результатов лучшего месяца отдельно для каждого магазина. Хотя, может ТС так и нужно :)

PowerBI_WannaBe, в моей мере выше при выборе нескольких магазинов в вычисляются данные за лучший месяц по общей прибыли (то есть один для всех магазинов, при этом для конкретного магазина это может быть не лучшим месяцем).
Если нужно так, как у mechanix 85 (то есть сумма данных по лучшему месяцу для каждого магазина), то немного измените меру:
Код
Лучший месяц2 :=
SUMX (
    VALUES ( 'Data'[Магазин] );
    CALCULATE (
        VAR tbl =
            ADDCOLUMNS (
                CALCULATETABLE ( VALUES ( 'Data'[ГодМесяц] ); ALL ( Data[Тип] ) );
                "@profit"; CALCULATE ( CALCULATE ( SUM ( [Сумма] ); ALL ( 'Data'[Тип] ) ) );
                "@income"; CALCULATE ( CALCULATE ( SUM ( [Сумма] ); 'Data'[Тип] = "Доход" ) )
            )
        VAR tableWithMaxProfit =
            FILTER ( tbl; [@profit] = MAXX ( tbl; [@profit] ) )
        VAR tableWithMaxProfitAndMaxIncomes =
            FILTER (
                tableWithMaxProfit;
                [@income] = MAXX ( tableWithMaxProfit; [@income] )
            )
        VAR lastMonth =
            MAXX ( tableWithMaxProfitAndMaxIncomes; 'Data'[ГодМесяц] )
        VAR result =
            CALCULATE ( SUM ( [Сумма] ); FILTER ( 'Data'; 'Data'[ГодМесяц] = lastMonth ) )
        RETURN
            result
    )
)
Изменено: surkenny - 24.12.2021 15:21:00
 
surkenny, mechanix 85, товарищи, огромное Вам спасибо! все работает!
*ушел разбираться, как работает)

P.S. а как вы прокачались в DAX до вашего продвинутого уровня? Просто любопытно. Тоже step by step, постепенно решая разные проблемы одну за другой?
Страницы: 1
Наверх