MDX - вычислить одно измерение даты из другого измерения даты - PullRequest
1 голос
/ 22 декабря 2011

У меня есть таблица фактов с двумя датами Invoice Date и Accounting Current Date. Чтобы получить запрашиваемое значение выручки, мне нужно использовать комбинацию этих двух дат. Например, если мне нужен доход с начала года, мне нужно выбрать его следующим образом:

(Примечание: я пишу SQL-запрос, потому что я более знаком с ним)

SELECT Revenue
FROM
Fact_Revenue
WHERE
Invoice_Date <= '2011-10-22'
and AccountingCurrent >= '2011-01'
and AccountingCurrent <= '2011-10'

Помимо выручки, в этих таблицах фактов есть и другая информация, которая мне также нужна, но для расчета других данных мне не нужна Accounting Current Date. Поэтому моя идея состоит в том, чтобы использовать только 1 дату (Invoice Date) в основном запросе MDX (чтобы я мог собрать как можно больше данных за 1 запрос), а для расчета дохода я хотел бы использовать Рассчитанный член, и там я бы нравится связывать Accounting Current Date с выбранным Invoice Date.

Например

SELECT {[Measure].[RevenueYTD], 
[Measure].[RevenueMTD], 
[Measure].[NumberOfInvoices], 
[Measure].[NumberOfPolicies]} 
ON COLUMNS, 
{[People].Members} ON ROWS 
FROM [Cube]
WHERE
[Invoice Date].[Date Hierarchy].[Date].&[2011-10-22]

В этом случае [Measure].[RevenueYTD] и [Measure].[RevenueMTD] должны быть ограничены Accounting Current Date, а Invoice Date должно быть меньше, чем дата из запроса. С другой стороны, мне нужно [Measure].[NumberOfInvoices] и [Measure].[NumberOfPolicies] для конкретной даты выставления счета (или даты MTD, как угодно), но без участия Accounting Current Date

Вычисляемый запрос члена должен делать что-то вроде этого (это больше похоже на алгоритм):

ROUND(
    SUM(
        YTD([Accounting Current Date].[Date Hierarchy].CurrentMember), 
        [Measures].[Revenue]
        ),
    2)
WHERE [Invoice Current Date].[Date Hierarchy] < [Invoice Current Date].[Date Hierarchy].CurrentMember

1 Ответ

1 голос
/ 23 декабря 2011

Переход от одного измерения к другому не является чем-то тривиальным в MDX. В теории измерения независимы, поэтому в стандартном языке отсутствуют функции для этого. Вы можете использовать функцию StrToMember MDX , но она медленная и немного странная.

Для ваших фильтров давайте начнем с первого:

Invoice_Date <= '2011-10-22'

В MDX нам нужно создать набор, члены которого соответствуют выражению. Это можно сделать с помощью оператора Range set:

NULL:[Invoice Date].[Date Hierarchy].[Date].&[2011-10-22]

Другой фильтр легко угадать:

AccountingCurrent >= '2011-01' and AccountingCurrent <= '2011-10'

Версия MDX:

[Accounting Date].[Date Hierarchy].[Date].&[2011-01-31]:[Accounting Date].[Date Hierarchy].[Date].&[2011-10-30]

Также возможно использование Функция фильтра MDX , если вам нужны фильтры другого типа.

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

 WITH 
   // here we're changing the 'selection' from the where clause
   MEMBER [Measure].[NumberOfInvoices II] AS ([Accounting Date].[Date Hierarchy].defaultmember,[Measure].[NumberOfInvoices])
 SELECT
   .. axis here [Measure].[RevenueYTD] will be applying the filters defined in the where clause
 FROM MyCube
 WHERE {[Accounting Date].[Date Hierarchy].[Date].&[2011-01-31]:[Accounting Date].[Date Hierarchy].[Date].&[2011-10-30]}
...