我是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
答案 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())