MDX - 从另一个日期维度计算一个日期维度

时间:2011-12-22 10:45:48

标签: date mdx dimension

我有一个包含2个日期Invoice DateAccounting Current Date的事实表。为了获得请求的收入值,我需要使用这两个日期的组合。例如,如果我需要YTD收入,我需要选择它:

(注意:我正在编写SQL查询,因为我对它更熟悉)

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

除了Revenue,这个事实表还有我需要的其他信息,但是为了计算这些其他数据,我不需要Accounting Current Date。所以我的想法是在主MDX查询中只使用1个日期(Invoice Date)(这样我可以尽可能多地使用1个查询获取数据)并计算Revenue我想使用Calculated Member并在那里我想将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 个答案:

答案 0 :(得分:1)

在MDX中,从一个维度导航到另一个维度并非易事。理论上,维度是独立的,因此标准语言缺少这样做的功能。你可以使用StrToMember MDX function,但它很慢而且有点奇怪。

对于您的过滤器,让我们从第一个开始:

Invoice_Date <= '2011-10-22'

在MDX中,我们必须创建一个包含与表达式匹配的成员的集合。这可以使用范围集运算符来完成:

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]

如果您需要不同类型的过滤器,也可以使用Filter MDX function

现在我们需要接下来并构建查询。一种可能的解决方案是使用set slicer并在不希望应用过滤器时覆盖值:

 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]}