Мне потребовалось немного времени, чтобы понять, где это будет работать с иерархией времени и без нее в измерении времени. Основываясь на моих данных и структуре куба, вот что я собрал:
with member [Measures].[RunningTotal] as
'sum({[Deferred Revenue Date].[Standard Calendar].CurrentMember.Level.Item(0):[Deferred Revenue Date].[Standard Calendar].CurrentMember}, [Measures].[Deferred Revenue Amount])'
select
{[Measures].[Deferred Revenue Amount]
,[Measures].[RunningTotal]
} on columns,
nonempty([Deferred Revenue Date].[Standard Calendar].[Date], [Measures].[Deferred Revenue Amount]) on rows
from
DW;
Одним из приемов является предложение nonempty (), которое будет возвращать значения только в столбце вычисленной меры, если есть пересечения с измерением и мерой. Без этого вы получите кучу NULL в столбце меры и кучу повторных значений в столбце вычисленной меры. На самом деле это довольно удобный запрос.
Рассчитанный элемент будет работать независимо от уровня, указанного вами в операторе SELECT, будь то дата, месяц или год. В моем случае я пытался свидание как можно ближе к тому, что ты пытался сделать. Я написал запрос, похожий на ваш, для моего куба, и он запустился за 43 секунды. Этот новый запускается примерно за 2 секунды, и у нас довольно много данных, поэтому он должен работать гораздо быстрее и для вас, при условии, что у вас построены агрегаты и т. Д.
Проблема с MDX в том, что есть как восемнадцать способов что-то сделать, и только один или два будут работать хорошо.
Удачи.