MDX, если дата в моем кубе больше, чем неправильно
У меня есть проблема, которая кажется очень простой для решения, но я не могу. В моей таблице фактов у меня есть поле Timestamp, которое является типом smalldatetime. Этот факт связан с измерением Time через его fulldate_Fk (также SmallDatetime). Итак, я хотел бы сравнить временную метку с FullDate_FK из факта, чтобы создать такой расчет:
iif([Dim Time].[Date].CurrentMember.MemberValue <=
[Fact].[Timestamp].CurrentMember.MemberValue
,[measures].[YTD Actuals]
,[measures].[YTD Actuals]+[measures].[YTD Com])
Но это не работает вообще. Все [Dim Time]. [Date] кажутся оцененными как<чем отметка времени. PS: метка времени является последней датой, когда данные были загружены в БД (в моем случае 31/08)
Вот результат, который я получил:
MONTH | YTD Actuals | YTD Com | Calculation;
JAN , 10 , 10 , 10;
FEB , 20 , 10 , 20;
MAR , 40 , 20 , 40;
MAY , 60 , 30 , 60;
JUN , 70 , 50 , 70;
JUL , 85 , 50 , 85;
AUG , 120 , 55 , 120;
SEP , 120 , 60 , 120;
OCT , 120 , 70 , 120;
NOV , 120 , 80 , 120;
DEC , 120 , 90 , 120;
С августа в расчетах должна быть сумма фактических с начала года и общих с начала года, но у меня все еще есть только фактические с начала года?
Дополнительная информация Я использую сводную таблицу, просто перетаскивая атрибуты в Excel. Месяц в строках и мерах (2 с начала года и новый вычисляемый элемент)
1 ответ
Если вы строите новый Calc, который:
[Fact].[Timestamp].CurrentMember.MemberValue
Что он возвращает, когда вы добавляете его в сводную таблицу? Ноль? Я подозреваю, что CurrentMember является членом All, поэтому MemberValue имеет значение null. Но давайте проверим это.
Все ли строки в таблице фактов имеют одну и ту же метку времени или много разных меток времени?
Если ваша таблица фактов содержит 10000 строк, ожидаете ли вы, что вычисление IIf будет оцениваться 10000 раз (по одному разу для каждой строки)? Это не так, как работает MDX. В вашей сводной таблице, которая имеет 12 строк, вычисление IIf вычисляется 12 раз в месяц.
Если вы хотите, чтобы вычисление выполнялось в каждой из 10000 строк, запишите вычисление в SQL и сделайте это в представлении SQL, прежде чем оно попадет в куб.
Чтобы калькулятор работал так, как вы собираетесь в кубе, подумайте о следующем. Добавьте новый столбец в таблицу SQL DimTime с именем Today Flag. Он должен быть обновлен во время ETL, чтобы быть Y только в строке, которая является сегодня, и должен быть N в других строках. Затем добавьте этот столбец в качестве нового атрибута в измерение Dim Time. Вы можете сделать это Visible=False. Затем перейдите на вкладку "Расчеты" и перейдите к представлению "Сценарий" и замените текущую калькуляцию [Показатели].[Расчет] на следующую:
Create Member CurrentCube.[Measures].[Calculation] as
[measures].[YTD Actuals];
Scope({Exists([Dim Time].[Month].[Month].Members,[Dim Time].[Today Flag].&[Y]).Item(0).Item(0):null});
[Measures].[Calculation] = [measures].[YTD Actuals]+[measures].[YTD Com];
End Scope;