请帮忙看看这个聚合汇总的问题,无法在任意形状的上下文中解析表达式。

0
上一问题 https://ask.hellobi.com/question/19387  苦等两天没人回答,自己只能想了以下两种方法,但都遇到问题:
上一问题是为了方便说明,把实际问题重新编了一下,下面是实际中的情况:
实事数据,有USD金额度量值,数据是以月为单位采集,一次采集后(数据版本1),可能过几个月,数据会有修正,因此,需要再次将修正后的数据导入数据库(仍然以月为单位,此处假设最多更新一次,即:数据版本2)
统计时,要求以最新版本数据优先进行运算,如:1月和2月有版本2数据,3-12月只有版本1数据,涉及到1、2月运算,用版本2,其它月用版本1。
为此,创建了一个[数据版本]维度,测试数据准备如下:

QQ截图20160527120657.jpg

 
(为了方便判断,1、2月添加的 数据版本2 测试数据,是版本1数据的一半)
 
上图MDX查询如下图:

QQ截图20160527124003.jpg
 /*上图代码:
金额USD前有下划线,是因为统计时要根据情况转换成万或亿等单位,加下划线,便于定义计算成员时使用不带下划线的名字,不知道是否还有更好的方法*/
WITH
MEMBER [Measures].[__金额USD] AS [Measures].[_金额USD]
MEMBER [Measures].[USD金额] AS round([Measures].[__金额USD]/10000,1),FORMAT_STRING ='#;;;-',SOLVE_ORDER=1
MEMBER [Measures].[__金额USD上期] AS ([Measures].[__金额USD],ParallelPeriod([时间].[年].[年],1,[时间].[年].CurrentMember)),SOLVE_ORDER=1
MEMBER [Measures].[USD上期金额] AS round([Measures].[__金额USD上期]/10000,1),SOLVE_ORDER=2
MEMBER [Measures].[USD同比] AS ([__金额USD]-[__金额USD上期])/[__金额USD上期],FORMAT_STRING='0.0%;;;-',SOLVE_ORDER=300
MEMBER [Measures].[USD环比] AS ([Measures].[__金额USD]/([Measures].[__金额USD],([时间].[月].CurrentMember.PrevMember),[时间].[时间].CurrentMember)-1)
,FORMAT_STRING='0.0%;;;-',SOLVE_ORDER=300

SELECT
{ [数据版本].[数据版本].&[0],[数据版本].[数据版本].&[1] }
*
{ [Measures].[USD金额],[Measures].[USD同比],[Measures].[USD环比] } ON COLUMNS
,
{ [时间].[月].members } ON ROWS
FROM [CUBE]



尝试一:为了实现想要的效果,尝试把上面的 MEMBER [Measures].[__金额USD] 改成:

QQ截图20160527124129.jpg
MEMBER [Measures].[__金额USD] AS
case [数据版本].[数据版本].CurrentMember
when [数据版本].[数据版本].&[0] Then ([数据版本].[数据版本].&[0],[Measures].[_金额USD])
when [数据版本].[数据版本].&[1] Then IIF(
([数据版本].[数据版本].&[1],[Measures].[_金额USD])
,([数据版本].[数据版本].&[1],[Measures].[_金额USD])
,([数据版本].[数据版本].&[0],[Measures].[_金额USD])
)
Else "Null"
End

获得结果:


QQ截图20160527122525.jpg

 
很显然,[All]计算有问题,进一步,增加两个[合计]的计算成员(发下),试了一下聚合:
 member [时间].[月].[sum合计] as sum([时间].[月].[月].members,[Measures].CurrentMember),SOLVE_ORDER=1000
member [时间].[月].[Aggregate合计] as Aggregate([时间].[月].[月].members,[Measures].CurrentMember),SOLVE_ORDER=1000
结果如下:

QQ截图20160527122738.jpg

 
----------------------------------------
尝试二:
此外,还试了另一种比较极端的方法,在一个MDX版本上增加一个子查询:
FROM 
(SELECT {
([时间].[月].&[1],[数据版本].[数据版本].&[1]),
([时间].[月].&[2],[数据版本].[数据版本].&[1]),
([时间].[月].&[3],[数据版本].[数据版本].&[0]),
([时间].[月].&[4],[数据版本].[数据版本].&[0]),
([时间].[月].&[5],[数据版本].[数据版本].&[0]),
([时间].[月].&[6],[数据版本].[数据版本].&[0]),
([时间].[月].&[7],[数据版本].[数据版本].&[0]),
([时间].[月].&[8],[数据版本].[数据版本].&[0]),
([时间].[月].&[9],[数据版本].[数据版本].&[0]),
([时间].[月].&[10],[数据版本].[数据版本].&[0]),
([时间].[月].&[11],[数据版本].[数据版本].&[0]),
([时间].[月].&[12],[数据版本].[数据版本].&[0])
} ON 0
FROM [CUBE])
出来的结果是:

QQ截图20160527123633.jpg

 
想想也是,确实不是个立方体了,呵呵呵呵
 
到此,不知道该怎么办了,:( ,请哪位大神指条路吧,谢谢!
已邀请:
0

freewing 2016-05-27 回答

目前,打算用:导入新版本数据和旧版本数据之间的“差”的 方法来解决计算问题。 
0

老头子 - 专注是唯一的捷径 2016-05-27 回答

帮你邀请了sqlserver的高手

要回复问题请先登录注册