2016-02-08 8 views
0

Я уже давно работаю в кубе OLAP в качестве синтаксического кода в excel, но в последнее время я пытаюсь интегрировать некоторые расчетные меры для оптимизации некоторых вещей, и я ударил стену.Работа с OLAP-кубом в Excel; определять месячные значения в более широком диапазоне дат?

В кубе установлены фильтры даты, указывающие месяц & год (они становятся более конкретными, но более тонкие уровни не используются).

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

Я хотел бы создать вычисляемый показатель, который будет отображать средний балл для каждого проекта, пока 2 критериев:

  1. Существует минимум 100 наблюдений для всего диапазона дат
  2. нет месяцев с нулевыми наблюдениями в диапазоне дат, указанном в переменной.

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

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

IIF([Measures].[OBSERVATIONS]>=100,[Measures].[AVERAGE],"^^") 

Теперь мне нужно добавить критерии без месяцев с нулевыми наблюдениями.

Я попытался использовать COUNT(), но в этой форме он игнорирует диапазон дат, заданный в pivottable, и возвращает количество всех месяцев, в течение которых существует какое-либо значение для проекта, включая нули.

COUNT(([Calendar].[Calendar].[Month],[Measures].[OBSERVATIONS]),EXCLUDEEMPTY) 

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

MIN([Calendar].[Calendar].[Month],[Measures].[OBSERVATIONS]) 

Я думаю CurrentMember это то, что я нужно включить, но я не могу заставить его работать для меня.

Предполагая, что это уместно, и я не уверен, что лучший способ объяснить календарь иерархии, так что это отражает то, что у меня есть:

OLAP Cube calendar

Первый календарь листинг является один используется для фильтрации данные сводной таблицы, а также выведены в выражения mdx выше.

EDIT:

Спасибо @SouravA за ответ. Я пробовал несколько вещей, и учитывая, что форматирование в комментариях ограничено, вот краткое изложение того, что я сделал.

Я получаю сообщение об ошибке, которое говорит «Query (1.35) Parser: Синтаксис для„С“неправильна»

, чтобы убедиться, что я использую это правильно:

После внося изменения ниже, я вложил все это в окно MDX: из инструмента «рассчитанные меры» в Excel.

Я, конечно, изменил ЗАМЕЧАНИЯ и СРЕДИ к именам переменных в моем кубе.

Я изменил '[Project]. [ProjectCode]' на '[Project]. [ProjectName]', как мой куб настроен.

On '[NewMeasure]' Я изменил его на имя, которое я использую для рассчитанной меры.

на '[ваш куб]' Я пробовал пару разных вещей; ссылка на куб, которую я использую в формулах куба в excel, выглядит так: «Cubename NormativeCube», поэтому я попытался вставить это в скобки с кавычками и без них, оставив часть NormativeCube и выполняя все это без скобок.

Я также изменил последнюю строку после 'WHERE', чтобы отразить диапазоны дат следующим образом: '[Календарь]. [Календарь]. [Месяц]. & 1 & [2015]: [Календарь]. [Календарь]. [Месяц]. & [12] & [2015] '

Я также установил это как [Календарь]. [Месяц]. [Месяц]. & 1: [Календарь]. [Месяц]. [Месяц]. & [12] '

Кроме того, еще один вопрос; будет ли эта работа работать в любом диапазоне дат, или она предназначена для указания в MDX? Мне нужно, чтобы он функционировал на основе диапазона дат, заданного фильтрами куба.

EDIT 2:

мне просто нужно настроить этот чуточку изменив «> 0» в «= 0», как оригинальное решение показал среднее значение для тех, которые не имеют данных для каждый месяц в диапазоне дат и настраивать одно из выражений набора календаря или что угодно.

IIF 
(
    [Measures].[OBSERVATIONS]>=100 
    AND 
    COUNT 
    (
    FILTER 
     (
     EXISTS 
      (
      [Calendar].[Calendar].[Month].MEMBERS 
      ,EXISTING [Calendar].[Calendar].[Month].MEMBERS 
      ) 
     ,[Measures].[OBSERVATIONS] = 0 
     ) 
    ) = 0 
    ,[Measures].[AVERAGE] 
    ,"^^" 
) 

РЕДАКТИРОВАТЬ 3:

Найдено ограничение;

измерение действует только в том случае, если диапазон дат, определенный для куба, находится в целом приращении иерархии календаря; т.е. один месяц, один квартал или один год. делать 2 месяца, 2 четверти, 2 года или разбить через 2 четверти или годы, вернет ложный результат из выражения IIF().

Я играл с несколькими разными способами, чтобы настроить его, но не могу заставить его работать.

EDIT 4:

Re:. Календарь иерархия

Глядя снизу [календарь] [календарь] есть 4 варианта: год, квартал, месяц, & Дата Key.

глядя на участников в течение года, квартала, & Месяц, вы можете развернуть весь путь до индивидуального дня.

Свойства членов в рамках этих 3-х списках только на следующий уровень вверх по иерархии

на дату ключ, свойства элементов являются следующие: Месяц Название Месяц Год времени Calcs (это не делать к моему знанию) неделя года неделя

EDIT 5:

Так это то, что работает (в конце концов). Я, должно быть, что-то испортил, и редактирование исходной формулы вызвало вторичную проблему, которую я имел. Вот что сработало для меня.

IIF 
(
    [Measures].[OBSERVATIONS]>=100 
    AND 
    COUNT 
    (
    FILTER 
     (
     EXISTS 
      (
      [Calendar].[Calendar].[Month].Members 
      ,EXISTING [Calendar].[Calendar].Members 
      ) 
     ,[Measures].[OBSERVATIONS] = 0 
     ) 
    ) > 0 
    ,[Measures].[AVERAGE] 
    ,"^^" 
) 

ответ

1

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

WITH SET ZeroObservationMonths AS 
FILTER 
    (
    EXISTS 
     (
     [Calendar].[Calendar].[Month].MEMBERS 
     ,EXISTING [Calendar].[Calendar].[Date].MEMBERS 
     ) 
    ,[Measures].[OBSERVATIONS] = 0 
    ) 


MEMBER Measures.NewMeasure AS 
IIF 
(
    [Measures].[OBSERVATIONS]>=100 AND COUNT(ZeroObservationMonths) > 0 
    ,[Measures].[AVERAGE] 
    ,"^^" 
) 

SELECT [Project].[ProjectCode].MEMBERS ON 1, 
Measures.[NewMeasure] ON 0 
FROM [YourCube] 
WHERE ({[Calendar].[Calendar].[Date].&D1: [Calendar].[Calendar].[Date].&D2}) 

EDIT: Если вы планируете создать меру внутри первенствует, просто ниже MDX кода в текстовом поле «Новый вычисленной меры»

IIF 
(
    [Measures].[OBSERVATIONS]>=100 
    AND 
    COUNT 
    (
    FILTER 
     (
     EXISTS 
      (
      [Calendar].[Calendar].[Month].MEMBERS 
      ,EXISTING [Calendar].[Calendar].[Date].MEMBERS 
      ) 
     ,[Measures].[OBSERVATIONS] = 0 
     ) 
    ) > 0 
    ,[Measures].[AVERAGE] 
    ,"^^" 
) 

EDIT 2: Если фильтрация может произойти по любому атрибуту, а не только по дате, замените EXISTING [Calendar].[Calendar].[Date].MEMBERS на EXISTING [Calendar].[Calendar].MEMBERS в приведенном выше скрипте.

+0

см. Редактирование в исходном сообщении. – JYurkovich

+0

@JYurkovich - проверить мое редактирование – SouravA

+0

Спасибо! небольшая настройка, и это было сделано! Ты спасатель! – JYurkovich