Выборочное суммирование MDX для задачи нормализации - PullRequest
0 голосов
/ 22 апреля 2010

Я новичок в MDX, и у меня возникла проблема с фильтрацией значений из суммирования.

Мы хотим выполнить вычисления нормализации, в частности, величину (q), деленную на основу (b), чтобы получить интенсивность (I). Формула довольно проста: I = q / b.

СТРУКТУРА НАШЕГО КУБА:

У нас есть таблицы фактов FactQuantity и FactBasis, каждая из которых связана с нашими таблицами измерений DimOrg и DimTime. Оба измерения имеют иерархию: месяцы объединяются в годы в DimTime, а местоположения объединяются в бизнес-единицы и группы в DimOrg.

Таблицы фактов не синхронизированы друг с другом: только потому, что количество существует для определенного org_id и времени, не гарантируется существование базы для того же самого org_id и времени.

МОЯ ПОПЫТКА НА РЕШЕНИЕ:

Базовая форма вычисляемого члена проста: [Measures]. [Количество] / [Measures]. [Базисные]

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

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

БЫСТРЫЙ ПРИМЕР:

org_id 001 в группе A имеет основание 100 и количество 1000, поэтому его расчетная интенсивность равна 1000/100 = 10. Хорошо до сих пор. org_id 002 также в группе A не имеет основания, но имеет количество 2000, поэтому его расчетные ошибки интенсивности отсутствуют. Хорошо.

При сворачивании в Группу A суммируется количество (3000) и основание (100), в результате чего вычисленная интенсивность равна 30, что неверно для Группы. 2000 должен был быть исключен, потому что у него не было соответствующего базового значения для того же org_id и времени.

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

Спасибо

1 Ответ

2 голосов
/ 22 апреля 2010

Дипак Пури ответил на это на форумах MSDN:

Предполагая, что [DimOrg]. [Location] и [DimTime]. [Month] являются атрибутами уровня листадля двух измерений вы можете суммировать числитель [Меры]. [Количество] только по тем листам с основой, как:

Sum(NonEmpty(existing [DimOrg].[Location].[Location].Members * [DimTime].[Month].[Month].Members, [Measures].[Basis]), [Measures].[Quantity]) / [Measures].[Basis]

...