Игнорировать связанные значения NULL в вычисляемом элементе SSAS - PullRequest
1 голос
/ 12 ноября 2011

Я создаю кубы служб Analysis Services в Visual Studio BIDS и у меня возник вопрос о суммировании в вычисляемых членах.

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

Вот развертка к Афинам в браузере кубов:

BIDS browser

Обратите внимание, что в Афинах есть 15 значений для квадратных футов, но только 5 значений для максимальной скорости, отражая мой источник реляционных данных, как показано здесь:

SQL Server query result

Итак, я хочу суммировать только пять квадратных футов, которые имеют связанные значения предела скорости. Делая математику с приведенным выше результатом реляционного запроса, вы можете увидеть, что это должно привести к сумме чуть более 900 КБ, а не к сумме 2 миллиона +, показанной на скриншоте BIDS.

Моя попытка этого расчета:

sum(
descendants(
            [Property].[Property by Region].CurrentMember,
            [Property].[Property by Region].[Metro Area]
            ),
iif([Measures].[Cap Rate] is null or [Measures].[Sq Ft] is null, 0, 
    [Measures].[Sq Ft])
)

в конечном итоге включает значения в квадратных футах, которые не имеют соответствующих предельных значений, поэтому я все равно получаю значение в 2 миллиона.

Почему мое предложение iff () работает не так, как следовало ожидать?

Ответы [ 2 ]

0 голосов
/ 13 июля 2015

Не могли бы вы сделать непустую задачу по отношению к потомкам по показателю предельной ставки?

0 голосов
/ 30 ноября 2011

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

CASE WHEN CapRate IS Null THEN Null Else CapRate * SqFt END

В кубе я добавил xWeightedCapRt в качестве новой меры. Я установил для его функции агрегирования значение Sum и временно оставил для свойства Visible значение True.

Я создал дополнительный Именованный расчет под названием "xSqFt", определяемый как:

CASE WHEN CapRate IS Null THEN Null Else SqFt END

и снова создал соответствующую меру.

На вкладке Расчет (конструктора кубов) я создал новый вычисляемый элемент [WAvg Cap Rate по Sq Ft] со следующей формулой:

[Measures].[x Weighted Cap Rt] / [Measures].[x Sq Ft]

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

Что я узнал, так это то, что вычисления на «уровне строк» ​​лучше всего выполнять через DSV. Затем вы можете использовать их для построения более сложных вычислений в кубе.

(ПРИМЕЧАНИЕ. Одна вещь, которую необходимо добавить к вышеприведенным шагам, это логика для обработки деления на нули.)

...