Фильтр динамического измерения многомерных выражений на основе значения другого измерения

Как я могу фильтровать значения из двух измерений в MDX?

Требуемый результат должен включать записи, в которых [Purchase Date].[Date] соответствует сегодняшнему дню минус количество лет, прошедших с [Accounting Date].[Year]. Таким образом, результат должен включать записи в годовом исчислении за сегодняшний день на основе [Purchase Date].[Date] для каждого [Accounting Date].[Year] участника.

Я хотел бы что-то вроде следующего:

 SELECT NON EMPTY [Measures].[Amount] ON 0,
 NON EMPTY [Accounting Date].[Year].[Year].ALLMEMBERS ON 1
 FROM [Tabular_Model]
 WHERE (
    NULL :
    STRTOMEMBER("[Purchase Date].[Date].&["+ Format(DateAdd("YYYY", [Accounting Date].[Year].CURRENTMEMBER.MEMBER_VALUE - 2020, Now()),"yyyy-MM-ddT00:00:00") + "]")
 )

Но происходит сбой с ошибкой: выполнение управляемой хранимой процедуры DateAdd завершилось сбоем со следующей ошибкой: Microsoft::AnalysisServices::AdomdServer::AdomdException. Синтаксис для «Все» неверен. (Все).

Почему CURRENTMEMBER.MEMBER_VALUE работает для HAVING, но не в моем предложении WHERE? Каков правильный путь?


person Fenix    schedule 24.12.2019    source источник


Ответы (1)


Попробуйте следующую меру и запрос:

 WITH
 MEMBER [Measures].[Trailing Amount] as    SUM({NULL :
    STRTOMEMBER("[Purchase Date].[Date].&["+ Format(DateAdd("YYYY", [Accounting Date].[Year].CURRENTMEMBER.MEMBER_VALUE - 2020, Now()),"yyyy-MM-ddT00:00:00") + "]")}, [Measures].[Amount])
 SELECT [Measures].[Trailing Amount] ON 0,
 NON EMPTY [Accounting Date].[Year].[Year].MEMBERS ON 1
 FROM [Tabular_Model]

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

define
measure 'Your Table Name Here'[Trailing Sales] = 
 VAR YearOffset = SELECTEDVALUE('Accounting Date'[Year]) - 2020
 VAR NowDate = NOW()
 VAR EndDate = DATE(YEAR(NowDate)+YearOffset,MONTH(NowDate),DAY(NowDate))
 RETURN CALCULATE([Amount], 'Purchase Date'[Date] <= EndDate)
evaluate ADDCOLUMNS(ALL('Accounting Date'[Year]),"Trailing Sales",[Trailing Sales])
person GregGalloway    schedule 25.12.2019
comment
Спасибо, запрос работает для меня. К сожалению, это очень медленно, когда используется больше измерений ON ROWS. С другой стороны, когда я использую T-SQL с циклом по дате учета, это происходит намного быстрее. Есть ли другой способ в MDX, как это сделать? - person Fenix; 30.12.2019
comment
@Fenix, пожалуйста, ознакомьтесь с правками выше, которые включают эквивалент DAX. Надеюсь, он будет работать лучше. - person GregGalloway; 30.12.2019