2017-01-19 24 views
0

Я полный нуб к DAX и OLAP, поэтому, пожалуйста, простите любые ошибки.DAX: Вычислить соотношение метрических А к собрата Метрика B (когда оба находятся в одной и той же группе)

История

В принципе, у меня есть Matrix компонент в PowerBI Desktop отчете. месяца находятся на колонках, Метрики - по строкам:

Excel

Проблема возникает при попытке вычислить отношение (в процентах в красный):

  1. Метрическая метрика B до Метрика A (B/A)
  2. Me Tric С к Метрика В (С/В)

Все показатели находятся в одной и той же группе. Я бы хотел, чтобы эти отношения были помещены как отдельные, но один столбец.

У меня нет проблем с расчетами Метрическая Отношение к итогу; Я просто взять SUM(#) и разделить на меры Итого:

Total = CALCULATE(SUM('Data'[#]); ALL('Data'[Metric])) 

Вопрос

Но как я могу получить SUM(#) агрегат для метрической X, которые я мог бы впоследствии использовать для расчета соотношения других показателей ?

Что я сделал до сих пор

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

Table = ADDCOLUMNS(
      SUMMARIZE('Data'; 
         'Data'[GroupAndMetric]; 
         'Data'[Year]; 
         'Data'[MonthNo]); 
      "Count"; 
      CALCULATE(SUM('Data'[#]); 'Data'[GroupAndMetric] = "Group A - Metric A") 
) 

оценил любую помощь.

ответ

1

Я думаю, что есть более простой способ получить ожидаемый результат, но я предполагаю, что ваши данные точно такие же, как и опубликованные в OP.

Создайте следующие меры для расчета предыдущих и текущих значений в данном контексте каждой метрики.

Сумма [#]:

CurrentValue = SUM(Data[#]) 

Текущая группа

CurrentGroup = FIRSTNONBLANK(Data[Group],0) 

Текущий Метрика

CurrentMetric = FIRSTNONBLANK(Data[Metric],0) 

Текущий месяц:

CurrentMonth = FIRSTNONBLANK(Data[Month],0) 

Это вычисляет предыдущий метрические

PrevMetric = 
IF (
    [CurrentMetric] = "Metric A", 
    BLANK(), 
    IF (
     [CurrentMetric] = "Metric B", 
     "Metric A", 
     IF ([CurrentMetric] = "Metric C", "Metric B", BLANK()) 
    ) 
) 

Вычислить предыдущую метрику сумму # необходимой для расчета соотношения:

Previous # Sum = 
CALCULATE (
    SUM (Data[#]), 
    FILTER (
     ALL (Data), 
     COUNTROWS (
      FILTER (
       Data, 
       EARLIER (Data[Metric]) = [PrevMetric] 
        && EARLIER (Data[Group]) = [CurrentGroup] 
        && EARLIER (Data[Month]) = [CurrentMonth] 
      ) 
     ) 
    ) 
) 

Наконец рассчитать соотношение:

% Ratio = DIVIDE([CurrentValue], [Previous # Sum]) 

Вы получите куча мер, но вам просто нужно использовать% Ratio в матрице:

enter image description here

Дайте мне знать, если это поможет.

+0

Работал как очарование. Правильно ли я помещаю 'Previous # Sum' в такие слова: * В' CALCULATE' взять столбец ** Данные [#] ** и 'SUM' на таблице, которая возвращается' FILTER'. В этом 1-м «ФИЛЬТРЕ» возьмите таблицу «ВСЕ» ** Данные **, несмотря на контекст родительского фильтра, и возьмите только те строки, где каждая строка соответствует критериям «COUNTROWS'> 0. Второй 'FILTER' использует ту же таблицу ** Data **, с тем же фильтрующим контекстом, что и в родительском' FILTER'. В этом втором 'FILTER' мы проверяем, были ли столбцы строк EARLIER, которые были отфильтрованы 1-м' FILTER', равны 'PrevMetric',' CurrentGroup' и 'CurrentMonth'. * – Gabrielius

+0

@Gabrielius, вы получили это !, просто что EARLIER во внутреннем FILTER служит для фильтрации этих строк в контексте Group, Metric и Month, чтобы получить правильные строки для подведения итогов. –

+0

Думаю, я понимаю. Но в каком контексте «PrevMetric», «CurrentGroup» и «CurrentMonth» работают и оцениваются? Они ограничены контекстами Matrix, определенными столбцами/строками «месяц», «группа» и «метрическая»? – Gabrielius

0

Есть, вероятно, (много) более эффективные способы сделать это, но вот один из способов:

Для метрики B, деленное на метрическую А (например):

Metric B to Metric A = 
DIVIDE (
CALCULATE (SUM (Data[#]), FILTER (Data, Data[Metric] = "Metric B")), 
CALCULATE (SUM (Data[#]), ALL (Data[Metric]), Data[Metric] = "Metric A"), 
BLANK() 
) 

Первый CALCULATE (числитель) возвращается пустым, если сводная таблица не фильтруется в метрику B. Второй CALCULATE (делитель) возвращает сумму метрики A (следуя за любыми другими применяемыми фильтрами, поэтому она не будет суммировать метрику B, которые являются в другой группе, например, пока группа находится на вашей сводной таблице). Если мы посмотрим на любой показатель, отличный от B, это целое подразделение будет BLANK, потому что числитель будет пустым. Окончательный BLANK говорит, что если нет метрики A (то есть деление на ноль), тогда результат также будет BLANK.

Предполагая 2 меры, как это, вы могли бы объединить их в одну колонку:

Final Ratio = 
IF (
NOT (ISBLANK ([Metric B to Metric A])) 
    && NOT (ISBLANK ([Metric C to Metric B])), 
BLANK(), 
IF (
    NOT (ISBLANK ([Metric B to Metric A])), 
    [Metric B to Metric A], 
    IF (
     NOT (ISBLANK ([Metric C to Metric B])), 
     [Metric C to Metric B], 
     BLANK() 
    ) 
) 

)

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