Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MDX在没有度量值的维度值上计算度量值_Mdx_Measure - Fatal编程技术网

MDX在没有度量值的维度值上计算度量值

MDX在没有度量值的维度值上计算度量值,mdx,measure,Mdx,Measure,我不熟悉mdx和SSAS,我们正在尝试将存储过程转换为mdx查询。我有一个立方体,如下所示: 事实表: [Target] (FK), [Date] (FK), [Action] (FK), [Amount] (Measure), 暗淡日期: [DateKey] (pk), [Date], [DayOfYear], [DayofWeek], [.

我不熟悉mdx和SSAS,我们正在尝试将存储过程转换为mdx查询。我有一个立方体,如下所示:

事实表:

         [Target] (FK),
         [Date] (FK),
         [Action] (FK),
         [Amount] (Measure),
暗淡日期:

        [DateKey] (pk),
        [Date],
        [DayOfYear],
        [DayofWeek],
        [....]
暗淡的行动:有四种行动增加,删除,连接

        [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

在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
最简单的方法是在多维数据集定义中创建一个寿命度量,让它指向事实表中的Amount列。让默认行为

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

您应该看到计算指令

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;

此度量将以正确的方式进行聚合。

您必须像这样使用“MemberValue”:

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

谢谢你的回复。在我的多维数据集上尝试过,但仍然无法工作,请检查我的问题,几分钟前编辑。再次感谢。最后,通过在dsv中添加一个命名的计算列来修复它,然后将该列用作度量值。通过遵循您的代码,我学到了很多关于范围和计算成员的知识。非常感谢。很抱歉,它仍处于未修复状态。我尝试为它创建一个命名的计算列,其中我使用GETDATE作为today来计算它,我认为GETDATE应该是查询运行时的日期时间,但我今天测试了它不是!它是多维数据集部署的日期。真令人沮丧!最后,通过在dsv中添加一个命名的计算列来修复它,然后将该列用作度量值