Запрос MDX SUM PROD для выполнения средневзвешенного значения

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

Я пытаюсь сделать что-то вроде следующего:

У меня есть одна мера под названием [Rank Search Product], которую я хочу применить на самом низком возможном уровне, а затем просуммировать все ее значения.

IIf([Measures].[Searches] IS NOT NULL, [Measures].[Rank] * [Measures].[Searches], NULL)

И затем моя средневзвешенная мера использует это:

IIf([Measures].[Rank Search Product] IS NOT NULL AND SUM([Measures].[Searches]) <> 0,
SUM([Measures].[Rank Search Product]) / SUM([Measures].[Searches]), 
NULL)

Я совершенно новичок в написании запросов MDX, и поэтому все это меня очень сбивает с толку. Расчет должен быть

 ([Rank][0]*[Searches][0] + [Rank][1]*[Searches][1] + [Rank][2]*[Searches][2] ...)
 / SUM([searches])

Я также пытался следовать тому, что объясняется в этой ссылке http://sqlblog.com/blogs/mosha/archive/2005/02/13/performance-of-aggregating-data-from-lower-level-in-mdx.aspx

В настоящее время загрузка моих данных в сводную таблицу в Excel возвращает #ЗНАЧ! для всех расчетов моих пользовательских мер.

Пожалуйста, помогите!


person Clarkie Cat    schedule 05.12.2013    source источник


Ответы (1)


Прежде всего, вам понадобится промежуточная мера, скажем, Rank times Searches в кубе. Самый эффективный способ реализовать это — вычислить его при обработке группы мер. Вы бы расширили свою таблицу фактов столбцом e. г. в представлении или добавьте именованное вычисление в представление источника данных. Выражение SQL для этого столбца будет примерно таким, как Searches * Rank. В определении куба вы должны установить для функции агрегирования этой меры значение Sum и сделать ее невидимой. Затем просто определите свое средневзвешенное значение как

[Measures].[Rank times Searches] / [Measures].[Searches]

или, чтобы избежать раздражающих результатов для нулевых/нулевых значений поиска:

IIf([Measures].[Searches] <> 0, [Measures].[Rank times Searches] / [Measures].[Searches], NULL)

Начиная с Analysis Services 2012 SP1, последнее можно сократить до

Divide([Measures].[Rank times Searches], [Measures].[Searches], NULL)

Затем механизм MDX автоматически применит все для вас во всех измерениях.

Во втором выражении тест <> 0 включает тест <> null, так как в числовом контексте NULL оценивается MDX как ноль — в отличие от SQL.

Наконец, поскольку я интерпретирую ссылку, которую вы имеете в своем вопросе, вы можете оставить свою меру Rank times Searches на уровне представления SQL/источника данных как угодно, может быть, просто 0 или null, а затем добавить следующее в свой сценарий расчета:

({[Measures].[Rank times Searches]}, Leaves()) = [Measures].[Rank] * [Measures].[Searches];

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

person FrankPl    schedule 05.12.2013
comment
Привет, спасибо за ваш ответ. Я пробовал это, но все еще получаю ту же проблему. Я обновил свой вопрос, чтобы показать, что я пытаюсь сделать в данный момент. - person Clarkie Cat; 06.12.2013
comment
Спасибо! добавление вычисления имен в представление источника данных было отличной идеей, я никогда не думал об этом. Теперь отлично работает спасибо. - person Clarkie Cat; 12.12.2013