2016-04-25 16 views
1

我有SSAS多维立方体,我需要查询在日期范围中的每一天的3个月运行平均值。如何从每个日期的SSAS多维立方体(MDX)查询3个月的运行平均值?

例如,对于2016-04-25我必须获取数据从2016-01-01到2016-03-31。 所以我不能使用此查询(因为我不知道我有多么的日子必然落后,直到上月):

WITH MEMBER [Measures].[SalesAmount 3m average] AS 
(
SUM(
    ([Date].[Date].CurrentMember.Lag(90) : 
    ([Date].[Date].CurrentMember.Lag(1), 
    [Measures].[SalesAmount] 
    ) 
) 

我想我需要使用祖先函数来获得一个月和使用滞后到月份粒度。

好吧,让我们试试这个:

WITH MEMBER [Measures].[SalesAmount 3m average] AS 
(
SUM(
    (Ancestor ([Date].[Date].CurrentMember, [Date].[Month])).Lag(3) : 
    (Ancestor ([Date].[Date].CurrentMember, [Date].[Month])).Lag(1), 
    [Measures].[SalesAmount] 
    ) 
) 
SELECT { [Measures].[SalesAmount 3m average] } ON Columns, 
{ [Date].[Date].&[2016-01-01T00:00:00] : [Date].[Date].&[2016-02-28T00:00:00]} On Rows 
FROM [Cube] 

不幸的是,这个查询无法正常工作(返回null)。

如何解决这个问题?

更新: 好吧,我tryed查询成员标题:

MEMBER [Measures].[Test] AS 
(
(Ancestor 
    ( [Date].[Date].CurrentMember, 
     [Date].[Date].[Month]) 
    ).Item(0).Member_Caption 
) 

而且我越来越没有一个月标题,但日期(日) - 在同一日期[日期]。 [日期] .CurrentMember。

然后我tryed这个查询:

--First try 
MEMBER [Measures].[Test] AS 
(
IsAncestor([Date].[Date].CurrentMember, [Date].[Month].&[2016-05-01T00:00:00]) 
) 

--Second try 
MEMBER [Measures].[Test] AS 
(
IsAncestor([Date].[Date].CurrentMember, [Date].[Date].[Month].&[2016-05-01T00:00:00]) 
) 

--Third try 
MEMBER [Measures].[Test] AS 
(
IsAncestor([Date].[Date].CurrentMember, [Date].[Year - Quarter - Month - Date].[Month].&[2016-05-01T00:00:00]) 
) 

在所有查询结果是 “假”。那么,月份会员不是Date会员的祖先?现在我真的很困惑。

我的约会尺寸看起来是这样的:

enter image description here

更新2:

MEMBER [Measures].[Test] AS 
(
(Ancestor 
    ( [Date].[Date].CurrentMember, 
     1) 
    ).Member_Caption 
) 

返回:所有

+0

你的代码看起来不错 - 我会尝试复制对付AdvWrks – whytheq

+0

好的 - 测试给了我们答案 - 我会更新我的答案 – whytheq

回答

1

您的代码似乎罚款。我会在几个地方,以使事情变得更加明显增加项目(0),但这不应该有太大变化

WITH 
    MEMBER [Measures].[SalesAmount 3m average] AS 
    Sum 
    (
     Ancestor 
     (
      [Date].[Calendar].CurrentMember 
     ,[Date].[Calendar].[Month] 
     ).Item(0).Lag(3) 
     : 
     Ancestor 
     (
      [Date].[Calendar].CurrentMember 
     ,[Date].[Calendar].[Month] 
     ).Item(0).Lag(1) 
    ,[Measures].[Internet Sales Amount] 
    ) 
SELECT 
    {[Measures].[SalesAmount 3m average]} ON COLUMNS 
,{ 
     [Date].[Calendar].[Date].&[20060222] 
    : 
     [Date].[Calendar].[Date].&[20060722] 
    } ON ROWS 
FROM [Adventure Works]; 

返回此:

enter image description here

检查你的所有水平的表达是正确的:

[Date].[Date] ? 

[Date].[Month] ? 

还作为进一步的测试,这返回什么?

WITH 
    MEMBER [Measures].[test1] AS 
    Ancestor 
    (
     [Date].[Date].CurrentMember 
    ,[Date].[Month] 
    ).Item(0).Lag(3).Member_Caption 
    MEMBER [Measures].[test2] AS 
    Ancestor 
    (
     [Date].[Date].CurrentMember 
    ,[Date].[Month] 
    ).Item(0).Lag(1).Member_Caption 
SELECT 
    { 
    [Measures].[test1] 
    ,[Measures].[test2] 
    } ON COLUMNS 
,{ 
     [Date].[Date].&[2016-01-01T00:00:00] 
    : 
     [Date].[Date].&[2016-02-28T00:00:00] 
    } ON ROWS 
FROM [Cube]; 

祖先将不同层次的同一层次即函数之间:

enter image description here

这意味着是[Date].[Date][Date].[Month]不通过祖先多大关系。试试这个:

WITH 
MEMBER [Measures].[SalesAmount 3m average] AS 
    (
    SUM(
     Ancestor ( 
     [Date].[Year - Quarter - Month - Date].CurrentMember, 
     [Date].[Year - Quarter - Month - Date].[Month]).Lag(3) 
     : 
     Ancestor( 
     [Date].[Year - Quarter - Month - Date].CurrentMember 
     ,[Date].[Year - Quarter - Month - Date].[Month]).Lag(1) 
     ,[Measures].[SalesAmount] 
    ) 
) 
SELECT 
{ [Measures].[SalesAmount 3m average] } ON Columns, 
{ 
    [Date].[Year - Quarter - Month - Date].[Date].&[2016-01-01T00:00:00] 
: [Date].[Year - Quarter - Month - Date].[Date].&[2016-02-28T00:00:00] 
//I suspect the above 2 lines can be replaced by following: 
// [Date].[Date].&[2016-01-01T00:00:00] 
//: [Date].[Date].&[2016-02-28T00:00:00] 
} 
    On Rows 
FROM [Cube]; 

这应该返回All因为层次[Date].[Date]只有两个层次......叶级与单级以上的所有日期:

MEMBER [Measures].[Test] AS 
(
(Ancestor 
    ( [Date].[Date].CurrentMember, 
     1) 
    ).Member_Caption 
) 
+0

非常感谢你,whytheq,我试过你查询测试并更新了我的问题。 – Oblomingo