MDX计算了没有测量值的尺寸值的度量

时间:2014-08-19 03:12:55

标签: mdx measure

我是mdx和SSAS的新手,我们正在尝试将我们的商店程序转换为mdx查询。我有一个像下面这样的立方体:

事实表:

         [Target] (FK),
         [Date] (FK),
         [Action] (FK),
         [Amount] (Measure),

昏暗日期:

        [DateKey] (pk),
        [Date],
        [DayOfYear],
        [DayofWeek],
        [....]

Dim Action:有四种动作(添加,删除,连接,......)

        [ID] (PK)
        [Name] 

昏暗的目标:

        [ID] (PK)
        [Name] 

我想创建一个计算的度量,就像我们在t-sql中所做的那样

 SELECT ....,
 SUM(

   CASE 
         WHEN a.[Action]='added' 

         THEN DATEDIFF(DAY, a.[Date],GETUTCDATE()) 
         ELSE DATEDIFF(DAY, a.[Date],GETUTCDATE())*-1
         END

)/NULLIF( SUM(CASE WHEN a.[Action]='added' THEN 1 ELSE 0 END),0)
 AS 'AverageLifespan'
 FROM FilterData a 
 GROUP BY a.[Target]

我试过但是失败了,它只返回0;

With Member [Measures].[LifeSpan] as
CASE  
WHEN  [Dim  Action Types].[Name].CURRENTMEMBER IS [Dim  Action Types].[Name].&[added] THEN  1*'datediff("d",[Dim Date].[Date],Now()) '
WHEN [Dim  Action Types].[Name].CURRENTMEMBER IS  [Dim  Action Types].[Name].&[removed] THEN -1*'datediff("d",[Dim Date].[Date],Now()) '
ELSE  0
End 
select [Measures].[LifeSpan] on columns,
[Dim Action Targets].[Name].Children on rows
from [OLAP Prep]

----------- ---------------输出

                         LifeSpan

tilerecipes/account-news    0
tilerecipes/competitornews  0
tilerecipes/innovation-blog 0
tilerecipes/sales-now       0
tilerecipes/inbox           0
tilerecipes/in-the-news     0
tilerecipes/jobs            0
tilerecipes/l-and-d         0

尝试以下查询,仍然无法正常工作(删除日期部分,仅用于测试):

 With Member [Measures].[LifeSpan] as
 CASE  
 WHEN [Dim  Action Types].[Name].CURRENTMEMBER IS [Dim  Action Types].                [Name].&[added] THEN  1 
 WHEN [Dim  Action Types].[Name].CURRENTMEMBER IS  [Dim  Action Types].  [Name].&[removed] THEN -1
 WHEN [Dim  Action Types].[Name].CURRENTMEMBER IS  [Dim  Action Types].[Name].[All] THEN Sum([Dim  Action Types].[Name].Children,[Measures].[LifeSpan])   -- this will work.
 ELSE  0
 End

 select [Measures].[LifeSpan] on columns,
 [Dim  Action Types].[Name].Members on rows
 from [OLAP Prep]

  --------Output------------

                  LifeSpan
 All                   0
added                  1
connected              0
disconnected           0
removed               -1

2 个答案:

答案 0 :(得分:0)

在MDX中要记住一件事:未汇总计算的度量。

沿着[Dim Action Targets].[Name]轴开发时,会使用[Dim Action Targets].[Name]默认成员,默认情况下为[Dim Action Targets].[Name].[All]

如果你试过

select [Measures].[LifeSpan] on columns,
[Dim Action Types].[Name].Members on rows
from [OLAP Prep]

[Dim Action Types].[Name].[All]会员外,您会看到计算出的衡量指标行为正常。

为了使您的计算出的度量在原始请求中正常运行

With Member [Measures].[LifeSpan] as
CASE  
WHEN [Dim  Action Types].[Name].CURRENTMEMBER IS [Dim  Action Types].[Name].&[added] THEN  1*'datediff("d",[Dim Date].[Date],Now()) '
WHEN [Dim  Action Types].[Name].CURRENTMEMBER IS  [Dim  Action Types].[Name].&[removed] THEN -1*'datediff("d",[Dim Date].[Date],Now()) '
WHEN [Dim  Action Types].[Name].CURRENTMEMBER IS  [Dim  Action Types].[Name].[All] THEN Sum([Dim  Action Types].[Name].Children,[Measures].[LifeSpan]) -- this will work.
ELSE  0
End

嗯,最简单的方法是在多维数据集定义中创建一个LifeSpan度量,使其指向事实表的Amount列。设为默认行为

现在,转到多维数据集定义的“计算”选项卡。切换到脚本模式。

您应该看到“CALCULATE”指令。

CALCULATE;

Scope([Measures].[LifeSpan]);
    This = 0; // We zero out the whole thing first
    Scope([Dim Date].[Date].Children,[Dim  Action Types].[Name].&[added]})
        This =  datediff("d",[Dim Date].[Date].CURRENTMEMBER,Now())
    End Scope;
    Scope([Dim Date].[Date].Children,[Dim  Action Types].[Name].&[removed]})
        This =  -datediff("d",[Dim Date].[Date].CURRENTMEMBER,Now())
    End Scope;
End Scope;

这项措施将以正确的方式汇总。

答案 1 :(得分:0)

您必须使用' MemberValue'像这样:

WHEN 
[Dim  Action Types].[Name].MemberValue IS 
[Dim  Action Types].[Name].&[added] 
THEN 
1*'datediff("d",[Dim Date].[Date],Now())