MDX在没有度量值的维度值上计算度量值
我不熟悉mdx和SSAS,我们正在尝试将存储过程转换为mdx查询。我有一个立方体,如下所示: 事实表:MDX在没有度量值的维度值上计算度量值,mdx,measure,Mdx,Measure,我不熟悉mdx和SSAS,我们正在尝试将存储过程转换为mdx查询。我有一个立方体,如下所示: 事实表: [Target] (FK), [Date] (FK), [Action] (FK), [Amount] (Measure), 暗淡日期: [DateKey] (pk), [Date], [DayOfYear], [DayofWeek], [.
[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中添加一个命名的计算列来修复它,然后将该列用作度量值