2015-12-22 2 views
1

У меня есть таблица PowerPivot, которая выглядит, как это ... все «факты» в одной таблице с колонной Информация, используемая для разделения:PowerPivot - создание коэффициентов из одного факта таблицы

Information | Year | Amount 
Expense  2010 1000000 
Units Sold 2010 50000 
Expense  2011 2000000 
Units Sold 2011 125000 

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

Например ...

  • Расходы/Проданы за 2010, 2011 или комбинированные (на основе фильтров, применяемых в Excel)
  • ..... 2010 = 1000000/50000 = 20; 2011 = 2000000/125000 = 16; все время = 3000000/175000 = 17.14 ETC.

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

Как это сделать в Powerpivot? Я могу рассчитать знаменатель, используя (в качестве примера) РАСЧЕТ (СУММ (факт [количество]), факт [информация] = «Единицы проданы»)), но не может получить этот знаменатель применительно ко всем числителям.

х х х х

Добавление последующих на основе ответа, представленной ниже ...

Выпуск № 1: Решение, предлагаемое ниже работает, когда я смотрю на общей сумме расходов, но на самом деле линия расходов будет состоять из нескольких строк (Зарплата, Льготы, Аренда и т. д.), и я должен уметь вычислять каждый за единицу Продано. Решение, похоже, не позволяет этого.

Выпуск № 2: Таблица фактов в настоящее время имеет четыре различных типа информации ... Расходы (как указано выше), Единицы Проданные, Численность и Квадратные футы. То, что я хотел бы сделать, это иметь расходы за до продажи, количество на единицу продано и т. Д. Другими словами, знаменатель, который можно применить ко всем строкам, которые можно легко суммировать в сводной таблице. Решение принимает все, что не является единицей продано, суммирует его, а затем делит на единицы продано ... смешивания расходов, численности и площади.

Еще раз спасибо за помощь.

ответ

1
SumAmt:= SUM(FactTable[Amount]) 

UnitsSoldDenominator:= 
DIVIDE(
    CALCULATE(
     [SumAmt] 
     ,FILTER(
      VALUES(FactTable[Information]) 
      ,FactTable[Information] <> "Units Sold" 
     ) 
    ) 
    ,CALCULATE(
     [SumAmt] 
     ,FactTable[Information] = "Units Sold" 
    ) 
) 

Это даст вам поведенческое поведение.

Необходимо потратить некоторое время, чтобы объяснить, почему наши параметры фильтра CALCULATE() различаются в числителе и знаменателе.

CALCULATE() с буквальным предикатом, как мы видим, во втором аргументе РАЗДЕЛИТЬ() неявно переписан в следующем:

CALCULATE(
    [SumAmt] 
    ,FILTER(
     ALL(FactTable[Information]) 
     ,FactTable[Information] = "Units Sold" 
    ) 
) 

FILTER() просто перебирает таблицы, переданной ей в аргументе один и возвращает строки из этой таблицы, для которых аргумент two возвращает true.

С неявным ALL(), там нет контекста, сохраненного из сводной таблицы.

VALUES() оценивает ссылку таблицы или столбца в контексте фильтра. Таким образом, когда мы оцениваем VALUES (FactTable [Information]), мы возвращаем только значение в контексте в сводной таблице. В любом конкретном году мы возвращаем каждый ярлык, который существует в этом году, в общем итоге мы получаем каждую метку. На уровне «Units Sold» мы ничего не возвращаем, потому что мы отфильтровываем это.

Вот изображение сводной таблицы с ожидаемым поведением на основе ваших данных образца и этой меры.

enter image description here

Редактировать для измерения таблицы

UnitsSoldDenominator:=DIVIDE(
    CALCULATE(
     [SumAmt] 
     ,FILTER(
      VALUES(DimInformation[Information]) 
      ,DimInformation[Information] <> "Units Sold" 
     ) 
    ) 
    ,CALCULATE(
     [SumAmt] 
     ,DimInformation[Information] = "Units Sold" 
    ) 
) 

Это зависит от активного отношения причем между DimInformation и таблица фактов. Я определил мой по номеру [InformationKey].

На изображении ниже представлены мои данные примера, основанные на том, что вы указали в исходном вопросе, плюс вычисленное из него измерение. Отображается сводная таблица вместе с расширенным списком полей. Отношения в моей модели отображаются в диалоговом окне управления отношениями в окне Power Pivot. Я вижу такое же поведение, как и запись оригинальной меры, которую я предоставил против FactTable [Информация], с новой версией, написанной против DimInformation [Информация].

Пожалуйста, дайте мне знать, если ваша модель настроена одинаково, и вы не можете воспроизвести это.

enter image description here

Edit 2 для иерархии

UnitsSoldDenominator:=DIVIDE(
    CALCULATE(
     [SumAmt] 
     ,FILTER(
      DimInformation 
      ,DimInformation[Information] <> "Units Sold" 
     ) 
    ) 
    ,CALCULATE(
     [SumAmt] 
     ,ALL(DimInformation) 
     ,DimInformation[Information] = "Units Sold" 
    ) 
) 

Здесь мы добавили вызов ALL (DimInformation) в знаменателе. Это связано с тем, что мы будем иметь контекст фильтра в сводной таблице из DimInformation [InformationGroup] и DimInformation [Information]. Предикат фильтра в CALCULATE(), DimInformation [Information] = «Units Sold», неявно разделяет контекст фильтра, который существует в DimInformation [Information], но когда мы помещаем DimInformation [InformationGroup] в сводную таблицу, он предоставляет новый набор фильтра (все контексты фильтра оцениваются в логическом и).

Таким образом, мы ищем (в примере на изображении ниже) DimInformation [InformationGroup] = «Расходы» (это контекст, который обеспечивается сводной таблицы) & & DimInformation [Информация] = «Единицы Продан ». Это невозможно в наших данных, поэтому знаменатель будет пустым.

Таким образом, мы снимаем контекст фильтра со всех DimInformation, а затем оцениваем наш литеральный предикат.

enter image description here

+0

Спасибо за быстрый ответ ... Я чувствую, что я все ближе к тому, что мне нужно, но не совсем там. Я добавлю несколько заметок в мой первоначальный вопрос, разъясняющий проблемы, которые я вижу. – user5708627

+0

Вы посмотрели на сводную таблицу на скриншоте, который я представил? VALUES() оценивается в контексте фильтра. Таким образом, когда конкретное значение [Информация] находится в контексте (например, когда оно используется как метка строки), тогда суммируются значения, связанные с этой конкретной [Информацией]. Не могли бы вы протестировать предоставленное решение и рассказать мне, если оно не отвечает вашим потребностям? Основываясь на вашем описании, это то, что вы хотите. – greggyb

+0

Пробуя кучу вещей, я вижу, где моя проблема идет, но я потерял то, что вызывает ее, и могу ли я ее решить. В модели данных, которую я имею, поле «Информация» ссылается на таблицу измерений. Для упрощения использования модели поле Факт [Информация] было сделано невидимым, в то время как поле dim_Information [Information] используется. Когда я использую поле dim_Information [Information] в своём стержне, я получаю не что иное, как итог (который вызвал мой первоначальный ответ). Когда я раскрываю поле FactTable [Information] и использую его, он работает так же, как вы заметили. Идеи о том, как я мог бы обратиться? – user5708627

Смежные вопросы